金刚石操作符简介
金刚石操作符是在 Java 7 中引入的,目的是使泛型代码更易读。泛型是一种类型参数。使用泛型,我们可以传递任何类型的对象给类的方法处理。例如,在 Java 7 之前,如果我们创建一个字符串列表,我们需要使用以下语法实例化一个字符串列表与 ArrayList
对象。
List<String> listOfStrings = new ArrayList<String>();
从 Java 7 开始,我们可以使用金刚石操作符简化上述语法如下:
List<String> listOfStrings = new ArrayList<>();
但在 Java 9 之前的匿名内部类中无法使用该操作符。例如,在 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) {
Handler<Integer> intHandler = new Handler<Integer>(1) {
@Override
public void handle() {
System.out.println(content);
}
};
intHandler.handle();
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) {
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