1

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

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

在此示例中,编译器推断泛型类 MyClass 的正式类型参数 X 的类型 Integer。它推断该泛型类的构造函数的形式类型参数 T 的类型 String。

4

2 回答 2

8

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

基本上,如果类型参数从使用表达式的上下文中是明确的(其中“clear”当然意味着“遵循精确的规则”),那么编译器将推断它。

于 2013-10-25T15:48:58.633 回答
1

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

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

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

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

至于菱形运算符,从 Java 7 开始,如果您已经将引用分配给引用,则在创建泛型类的实例时不需要提供类型参数。类型参数将从与引用类型一起使用的参数中推断出来,here Integer

于 2013-10-25T15:54:24.263 回答