Java教程

Java9 匿名内部类改进

Java 9引入了一项新功能,该功能使我们可以将Diamond运算符与匿名类一起使用。在Java 7中,不允许将Diamond与匿名类一起使用。
在Java 9中,只要推断类型是可表示的,我们就可以在创建匿名内部类时使用Diamond运算符。
可以用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

昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4