Java 教程

Java 控制語句

面向物件程式設計

Java 內建類

Java 檔案處理

Java 錯誤和異常

Java 多執行緒

Java 同步

Java 網路

Java 集合

Java 介面

Java 資料結構

Java 集合演算法

高階 Java

Java 雜項

Java API 和框架

Java 類引用

Java 有用資源

Java -菱形運算子



Java 菱形運算子

菱形運算子是在 Java 7 中引入的,旨在使 泛型 程式碼更易讀。泛型是一種引數型別。使用泛型,我們可以傳遞任何型別的物件以由 類方法 處理。例如,如果我們在 Java 7 之前建立字串列表,那麼我們需要使用以下語法來使用 ArrayList 物件例項化字串列表。

List<String> listOfStrings = new ArrayList<String>();

從 Java 7 開始,我們可以使用菱形運算子來簡化上述語法,如下所示:

List<String> listOfStrings = new ArrayList<>();

但它不能與 匿名 內部類一起使用。例如,在 Java 9 之前,我們無法從以下語法中的菱形運算子中省略物件型別。

Handler<Integer> intHandler = new Handler<Integer>(1) {
   @Override
   public void handle() {
      System.out.println(content);
   }
};

匿名類中的菱形運算子

在 Java 9 中,菱形運算子也可以與匿名類一起使用,以簡化程式碼並提高可讀性。

Handler<Integer> intHandler = new Handler<>(1) {
 @Override
 public void handle() {
	System.out.println(content);
 }
};

Java 7、Java 8 中的菱形運算子

在下面的示例中,我們為接受泛型引數的抽象類 Handler 建立了匿名類,並在建立匿名類時傳遞了物件型別,因為我們必須傳遞型別引數,否則程式將無法編譯。

示例

public class Tester {
   public static void main(String[] args) {
      // create an Anonymous class to handle 1
	  // Here we need to pass Type arguments in diamond operator 
	  // before Java 9 otherwise compiler will complain error
      Handler<Integer> intHandler = new Handler<Integer>(1) {
         @Override
         public void handle() {
            System.out.println(content);
         }
      };
      intHandler.handle();
      // create an Anonymous class to handle 2	  
      Handler<? extends Number> intHandler1 = new Handler<Number>(2) {
         @Override
         public void handle() {
            System.out.println(content);
         }
      };
      intHandler1.handle();
      Handler<?> handler = new Handler<Object>("test") {
         @Override
         public void handle() {
            System.out.println(content);
         }
      };
      handler.handle();    
   }  
}
abstract class Handler<T> {
   public T content;

   public Handler(T content) {
      this.content = content; 
   }
   
   abstract void handle();
}

輸出

讓我們編譯並執行上述程式,這將產生以下結果:

1
2
Test

Java 9 及更高版本中的菱形運算子

使用 Java 9,我們也可以將 <> 運算子與匿名類一起使用,如下所示。

示例

在下面的示例中,我們為接受泛型引數的抽象類 Handler 建立了匿名類,但在建立匿名類時沒有使用物件型別,因為我們不需要傳遞型別引數。編譯器本身會推斷型別。

public class Tester {
   public static void main(String[] args) {
      // create an Anonymous class to handle 1
	  // Here we do not need to pass Type arguments in diamond operator 
	  // as Java 9 compiler can infer the type automatically
      Handler<Integer> intHandler = new Handler<>(1) {
         @Override
         public void handle() {
            System.out.println(content);
         }
      };
      intHandler.handle();
      Handler<? extends Number> intHandler1 = new Handler<>(2) {
         @Override
         public void handle() {
            System.out.println(content);
         }
      };
      intHandler1.handle();
      Handler<?> handler = new Handler<>("test") {
         @Override
         public void handle() {
            System.out.println(content);
         }
      };

      handler.handle();    
   }  
}

abstract class Handler<T> {
   public T content;

   public Handler(T content) {
      this.content = content; 
   }
   
   abstract void handle();
}

輸出

讓我們編譯並執行上述程式,這將產生以下結果:

1
2
Test
廣告