【问题标题】:Explanation for this diamond notation?这个钻石符号的解释?
【发布时间】:2013-10-25 15:46:23
【问题描述】:

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

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

在这个例子中,编译器推断类型 Integer 的形式 泛型类 MyClass 的类型参数 X。它推断类型 this 的构造函数的形式类型参数 T 的字符串 泛型类。

【问题讨论】:

    标签: java generics diamond-operator


    【解决方案1】:

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

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

    【讨论】:

    • 好的。这就说得通了。他们没有显示 MyClass 的返回类型。这是否意味着 MyClass 的构造函数中包含一个“返回整数”?如果右侧说“new MyClass("").getInt();",对我来说会更有意义
    • @djangofan:没有“返回类型”——你在调用构造函数。构造函数总是返回你正在调用的构造函数的类型。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 我了解 MyClass 部分,我了解 " MyClass(S arg)" 部分,但我不了解 System.out.println(arg);不知何故与类型“T”有关。您不需要“返回整数”类型的东西吗?
    • @djangofan 是的。区别在于范围。 T 的作用域是整个类(当然是所有非静态成员),而S 的作用域只是构造函数。
    • @djangofan 构造函数不返回任何内容。它的工作是初始化对象。在内部,构造函数被转换为返回类型为void的实例方法。
    • 您的两个 cmets 都非常合理。不过我还是不太明白;让我猜猜:生成的名为“MyClass”的 Integer 对象的默认值为 0,而不管传递给它的字符串如何?
    • @djangofan 如果你的类中有一个T 类型的实例变量,比如T obj;,那么对于Integer 类型参数,它将具有默认值null。不会是0。您可以尝试添加一个字段,并为其添加一个吸气剂。然后调用实例的 getter。
    猜你喜欢
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 2019-11-19
    • 2016-02-03
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多