Java 9引入了一项新功能, 该功能使我们可以将Diamond运算符与匿名类一起使用。 Java 7中不允许将Diamond与匿名类一起使用。
在Java 9中, 只要推断类型是可表示的, 我们就可以在创建匿名内部类时使用菱形运算符。
可以用Java程序编写的数据类型(例如int, String等)被称为denotable类型。 Java 9编译器足够聪明, 现在可以推断类型。
注意:此功能已包含在Java 9中, 以在匿名内部类中添加类型推断。让我们看一个示例, 其中我们在内部类中使用Diamond运算符而不指定类型。
Java 9匿名内部类示例
abstract class ABCD<
T>
{ abstract T show(T a, T b);
}public class TypeInferExample { public static void main(String[] args) {ABCD<
String>
a = new ABCD<
>
() { // diamond operator is empty, compiler infer typeString show(String a, String b) {return a+b;
}};
String result = a.show("Java", "9");
System.out.println(result);
}}
输出:
Java9
尽管我们可以在Diamond运算符中显式指定类型, 并且编译器不会产生任何错误消息。参见下面的示例, 类型是显式指定的。
Java 9匿名内部类示例
abstract class ABCD<
T>
{ abstract T show(T a, T b);
}public class TypeInferExample { public static void main(String[] args) {ABCD<
String>
a = new ABCD<
String>
() { // diamond operator is not emptyString show(String a, String b) {return a+b;
}};
String result = a.show("Java", "9");
System.out.println(result);
}}
我们得到相同的结果。
输出:
Java9
怎么了?如果我们使用Java 8编译以下代码。
匿名内部类示例
abstract class ABCD<
T>
{ abstract T show(T a, T b);
}public class TypeInferExample { public static void main(String[] args) {ABCD<
String>
a = new ABCD<
>
() { // diamond operator is emptyString show(String a, String b) {return a+b;
}};
String result = a.show("Java", "9");
System.out.println(result);
}}
Java 8编译器会抛出编译时错误, 因为它无法推断类型。错误消息如下所示。
【Java 9匿名内部类改进】输出:
TypeInferExample.java:7: error: cannot infer type arguments for ABCD<
T>
ABCD<
String>
a = new ABCD<
>
() {^reason: cannot use '<
>
' with anonymous inner classeswhere T is a type-variable:T extends Object declared in class ABCD1 error
推荐阅读
- win7 wifi共享,本文教您Win7如何设置wifi共享
- Java类型推断
- Java类型和重复注解
- Java流过滤器
- Java 8流
- Java并行数组排序
- Java可选类
- Java方法引用
- Java 8 JDBC改进