从官方的Java JDK1.7指南中,我得到了这个引用,但我不明白它是如何工作的。谁能解释一下?换句话说,钻石在传递空String时如何推断出Integer类型?
MyClass<Integer> myObject = new MyClass<>("");
在此示例中,编译器推断出形式的Integer类型 通用类MyClass的类型参数X.它推断出类型 此构造函数的形式类型参数T的字符串 泛类。
答案 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
。