Java9 匿名内部类改进

1 Java9 匿名内部类的介绍

Java 9引入了一项新功能,该功能允许我们将Diamond运算符与匿名类一起使用。Java 7中不允许将Diamond与匿名类一起使用。

在Java 9中,只要推断出的类型是可表示的,就可以在创建匿名内部类时使用<>运算符。

可以用Java程序编写的数据类型(例如int,String等)被称为denotable类型。Java 9编译器足够聪明,现在可以推断类型。

注意:此功能已包含在Java 9中,以在匿名内部类中添加类型推断。

2 Java9 匿名内部类的案例1

/**
 * 一点教程网: http://www.yiidian.com
 */
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

3 Java9 匿名内部类的案例2

尽管我们可以在Diamond运算符中明确指定类型,并且编译器不会产生任何错误消息。参见下面的示例,类型是显式指定的。

/**
 * 一点教程网: http://www.yiidian.com
 */
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

4 Java9 匿名内部类的案例3

如果我们使用Java 8编译以下代码。

/**
 * 一点教程网: http://www.yiidian.com
 */
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

 

热门文章

优秀文章