个性化阅读
专注于IT技术分析

Java 9匿名内部类改进

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 type
			String 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 empty
			String 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 empty
			String show(String a, String b) {
				return a+b; 
			}
		};	
		String result = a.show("Java", "9");
		System.out.println(result);
	}
}

Java 8编译器会抛出编译时错误, 因为它无法推断类型。错误消息如下所示。

输出:

TypeInferExample.java:7: error: cannot infer type arguments for ABCD<T>
		ABCD<String> a = new ABCD<>() {
		                         ^
  reason: cannot use '<>' with anonymous inner classes
  where T is a type-variable:
    T extends Object declared in class ABCD
1 error
赞(0)
未经允许不得转载:srcmini » Java 9匿名内部类改进

评论 抢沙发

评论前必须登录!