在这篇博文中,我们将通过一个例子介绍Java9的特点--允许匿名内类的钻石运算符改进。
java7钻石运算符示例
我们可以按如下方式声明钻石运算符。
List listjava6 = new ArrayList(); // Before java7 ie Java6 or less
List listjava7 = new ArrayList<>(); // with java7
左边使用的是数据类型为String的Generics,右边的等价运算符是原始类型ArrayList,它是从左边的类型推断出来的。我们可以将钻石运算符应用于推断出的可表示类型的类型。DenotablJavapes是Integer, Strings,可以应用泛型来在java中使用。
例如,创建了一个抽象的Message类,如下所示
abstract class Message {
public T text;
public Message(T text) {
this.text = text;
}
abstract void getMessage();
}
Java8钻石运算符匿名内部类例子
在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钻石运算符程序示例
钻石运算符也可以用于内层类
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);
}
};
钻石运算符匿名内类程序示例
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();
}
因为在java8中引入了Lambda表达式,所以匿名的作用不大,但是他们提高了代码的可读性,如果需要,可以使用。