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
广告