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(&lt;&gt;)在匿名类中,编译器报告错误。
请参阅下面的示例:

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(&lt;&gt;),然后编译器未报告任何错误,并将成功编译代码。

示例:带钻石运营商的匿名类

让我们使用这个例子 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