
在这篇博文中,通过一个例子介绍_Java9的功能钻石运算符的改进,允许匿名的内层类。
让我们看看钻石运算符在java7,8,9版本中是如何声明的。
java7钻石运算符示例
我们可以按如下方式声明钻石运算符。
List listjava6 = new ArrayList(); // Before java7 ie Java6 or less
List listjava7 = new ArrayList<>(); // with java7
Left side 是使用数据类型为String的Generics,Right side ,等价运算符是原始类型,即ArrayList,它是从左侧类型推断出来的。我们可以将钻石运算符应用于可识别类型的推断类型。可识别类型是Integer, Strings,可以应用泛型在java中使用。
Java8钻石运算符匿名内部类示例
创建了一个抽象的Message类,如下所示
abstract class Message {
public T text;
public Message(T text) {
this.text = text;
}
abstract void getMessage();
}
我们将看到如何通过实现这个抽象类来创建一个实例。
使用java8,我们可以为上述的抽象实现写出如下的代码。
Message stringMessage = new Message("one") {
@Override
public void getMessage() {
System.out.println(text);
}
};
stringMessage.getMessage();
这是一个有效的代码,并且没有使用钻石运算符。
如何用钻石运算符写代码?
Message stringMessage1 = new Message<>("one"){
@Override
public void getMessage() {
System.out.println(text);
}
};
or
Message stringMessage1 = new Message<>("one") {
@Override
public void getMessage() {
System.out.println(text);
}
};
这段代码简单到可读。但这给出了 编译错误'<>'不能用于匿名类_.\
在java8或之前,编译器会对钻石运算符匿名内类抛出一个错误。
Java9允许对内层类使用带有匿名的钻石运算符。
Java9的钻石运算符程序示例
Diamond operators 也可以用于内层类。
Message stringMessage1 = new Message<>("one") {
@Override
public void getMessage() {
System.out.println(text);
}
};
or
Message stringMessage1 = new Message<>("one"){
@Override
public void getMessage() {
System.out.println(text);
}
};
java 钻石运算符匿名内层类示例
Anonyms内部类与钻石运算符一起使用
public class Summary {
public static void main(String[] args) {
Message stringMessage = new Message("one") {
@Override
public void getMessage() {
System.out.println(text);
}
};
stringMessage.getMessage();
Message stringMessage1 = new Message<>("two") {
@Override
public void getMessage() {
System.out.println(text);
}
};
stringMessage1.getMessage();
}
}
abstract class Message {
public T text;
public Message(T text) {
this.text = text;
}
abstract void getMessage();
}
输出
one
two
由于在java8中引入了Lambda表达式,所以Anonyms的使用并不多,但它们提高了代码的可读性,如果需要的话可以使用。