这个钻石符号的解释?

时间:2013-10-25 15:46:23

标签: java generics diamond-operator

从官方的Java JDK1.7指南中,我得到了这个引用,但我不明白它是如何工作的。谁能解释一下?换句话说,钻石在传递空String时如何推断出Integer类型?

MyClass<Integer> myObject = new MyClass<>("");
     

在此示例中,编译器推断出形式的Integer类型   通用类MyClass的类型参数X.它推断出类型   此构造函数的形式类型参数T的字符串   泛类。

2 个答案:

答案 0 :(得分:8)

Integer部分是从构造函数调用的结果的使用推断出来的 - 它分配给MyClass<Integer>类型的变量,因此Integer部分是推断钻石。构造函数参数与此无关(除非它必须是相同的类型,在这种情况下,您只会得到编译错误。)

基本上,如果从使用表达式的上下文中清楚地看出type参数(当然“clear”表示“遵循精确的规则”),那么编译器将推断它。

答案 1 :(得分:1)

引用表明你的类中有一个泛型构造函数,它声明了它自己的类型参数。这与创建泛型方法的方式类似。构造函数的类型参数是从实例化类时传递的参数推断出来的。

以下是与该调用匹配的类的简单版本:

 class MyClass<T> {
    <S> MyClass(S arg) {
        System.out.println(arg);
    }
 }

现在,当您在代码中实例化类时,类型参数T被推断为Integer,构造函数中的类型参数S被推断为String,从你传递的论点开始。

对于钻石运算符,从Java 7开始,如果已经为引用分配了引用,则在创建泛型类的实例时,不需要提供类型参数。类型参数将从与引用类型一起使用的参数推断出来,此处为Integer