给定一个接口,例如

public interface NumVal<C extends Number>{
      /* Put your most sophisticated code ever here! */
}


使用类似var的运行时是否有任何实际差异

NumVal myRawVal = (...)

NumVal<Number> mySuperVal = (...)吗?

我知道在编译时前者会引起更多警告。但是根据Oracle,在类型擦除之后也应该相等地设为Number,所以还是安全的,不是吗?

最佳答案

您似乎对擦除NumVal的声明的类型变量C感到困惑。

public interface NumVal<C extends Number>{


上面的声明引入了一个名为NumVal的新generic类型。 NumVal<Integer>是这种parameterization的示例。 NumValraw type

删除C,通过JLS definition


  擦除类型变量(第4.4节)是擦除其最左边界。


Number,在这些概念定义中永远不会起作用。

NumVal是原始类型的事实会影响您使用该类型的任何引用表达式的方式。当表达式中包含原始类型时,作为方法参数,作为方法调用目标等,该表达式的其他部分也将被删除。由于已将它们擦除,因此编译器无法保证表达式的类型安全,因此会警告您。

规范中详细讨论了潜在问题:


What is a raw type and why shouldn't we use it?

07-27 13:44