【问题标题】:Difference between using genric with position使用带有位置的泛型之间的区别
【发布时间】:2014-05-19 18:20:17
【问题描述】:

我有以下代码

Gen_Class<Integer> test = new Gen_Class<Integer>();

那么开头的 Integer> 和结尾的 &lt;Integer&gt; 有什么区别。 为什么我们要写两次?

有什么优势吗? 如果我们没有在开头添加会发生什么?

【问题讨论】:

  • 您必须在 java 7 之前的两边都指定类型,从 java 7 开始,您可以忽略右侧的类型规范并将其保留为 &lt;&gt;

标签: java oop generics computer-science


【解决方案1】:

那么开头和结尾有什么区别。为什么我们要写两次?

本身没有“差异”;您只需在两侧指定完整的类型名称。类型是参数化的,因此没有类型参数,类型名称是不完整的。然而,正如@JigarJoshi 在他的评论中指出的那样,Java 7 可以在许多情况下推断类型参数,允许您在赋值的右侧简单地编写空的 &lt;&gt; 括号,以及一些方法参数。

有什么优势吗?如果我们没有在开头添加会发生什么?

如果您在任一侧省略类型参数,则您指定的是原始类型,而不是参数化类型。后果会有所不同,具体取决于您是否将论点留在左侧、右侧或两者兼而有之。

如果您将它们留在左侧,那么您的 Gen_Class&lt;Integer&gt; 将变为 Gen_Class,这实际上与 Gen_Class&lt;Object&gt; 相同。这改变了语义;之前可能要求您传递Integer 的地方现在可以接受任何Object(这可能会或可能不会导致问题),并且暴露Integer 值的方法和字段现在可能会暴露Object 值。

【讨论】:

  • 很好的解释 :)
【解决方案2】:

如果您使用的是 Java 7 或 8,则可以省略第二个 Integer,如下所示:

Gen_Class<Integer> test = new Gen_Class<>();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多