Java9——匿名内部类和菱形运算符
时间:2020-02-23 14:34:54 来源:igfitidea点击:
类型推断是Java7中引入的Java的一个特性。现在,Java编译器可以自动推断数据的类型。
例如,如果我们创建一个ArrayList,那么我们使用如下代码:
List<String> list = new ArrayList<String>(); //Before Java 7 List<String> list = new ArrayList<>(); //From Java 7 and onward
你可以看到 Java 7允许我们使用空钻石运营商来避免代码冗余。
但我们只能使用这个java系列,匿名程序怎么样?
如果我们用匿名类别在Java 7中做同样的事情,意味着使用 empty diamond(<>)在匿名类中,编译器报告错误。
请参阅下面的示例:
abstract class CalculateAble<T>{
abstract T add(T a, T b);
}
public class Main {
public static void main(String[] args) {
CalculateAble<Integer> a = new CalculateAble<>() { //diamond operator is empty
public Integer add(Integer a, Integer b){
return a+b;
}
};
int result = a.add(10, 20);
System.out.println(result);
}
}
输出
error: cannot infer type arguments for CalculateAble
CalculateAble a = new CalculateAble() {
^
reason: cannot use " with anonymous inner classes
Note: The empty diamond operator with anonymous classes was not allowed in Java SE 7.
这就是我们在Java中如何创建一个匿名类 。
它适用于所有Java版本。
DemoCalculator<Integer> a = new DemoCalculator<Integer>() { //diamond operator is not empty
Integer show(Integer a, Integer b){
return a+b;
}
};
匿名类:Java 9改进
Java改进了其类型推理函数,并允许我们在匿名类中使用(钻石)。
例如,如果我们创建一个匿名类 empty diamond(<>),然后编译器未报告任何错误,并将成功编译代码。
示例:带钻石运营商的匿名类
让我们使用这个例子 Java 9更高版本,看看。
它将执行罚款。
abstract class CalculateAble<T>{
abstract T add(T a, T b);
}
public class Main {
public static void main(String[] args) {
CalculateAble<Integer> a = new CalculateAble<>() { //diamond operator is empty
public Integer add(Integer a, Integer b){
return a+b;
}
};
int result = a.add(10, 20);
System.out.println(result);
}
}
输出
30

