从官方 Java JDK1.7 指南中,我得到了这个引用,但我不明白它是如何工作的。谁能解释一下?换句话说,当菱形传递一个空字符串时,它是如何推断出一个 Integer 类型的?
MyClass<Integer> myObject = new MyClass<>("");
在此示例中,编译器推断泛型类 MyClass 的正式类型参数 X 的类型 Integer。它推断该泛型类的构造函数的形式类型参数 T 的类型 String。
从官方 Java JDK1.7 指南中,我得到了这个引用,但我不明白它是如何工作的。谁能解释一下?换句话说,当菱形传递一个空字符串时,它是如何推断出一个 Integer 类型的?
MyClass<Integer> myObject = new MyClass<>("");
在此示例中,编译器推断泛型类 MyClass 的正式类型参数 X 的类型 Integer。它推断该泛型类的构造函数的形式类型参数 T 的类型 String。
该Integer
部分是从构造函数调用的结果的使用中推断出来的——它分配给一个 type 的变量MyClass<Integer>
,因此该Integer
部分是为菱形推断的。构造函数参数与此无关(除非它必须是相同的类型,在这种情况下你只会得到一个编译错误。)
基本上,如果类型参数从使用表达式的上下文中是明确的(其中“clear”当然意味着“遵循精确的规则”),那么编译器将推断它。
引号表明您的类中有一个通用构造函数,它声明了它自己的类型参数。这类似于创建泛型方法的方式。构造函数的类型参数是从您在实例化类时传递的参数推断出来的。
这是与该调用匹配的类的简单版本:
class MyClass<T> {
<S> MyClass(S arg) {
System.out.println(arg);
}
}
现在,当您在代码中实例化您的类时,类型参数T
被推断为Integer
,并且S
构造函数中的类型参数被推断为String
,从您传递的参数。
至于菱形运算符,从 Java 7 开始,如果您已经将引用分配给引用,则在创建泛型类的实例时不需要提供类型参数。类型参数将从与引用类型一起使用的参数中推断出来,here Integer
。