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