给定一个接口,例如
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的示例。 NumVal
是raw type。删除
C
,通过JLS definition擦除类型变量(第4.4节)是擦除其最左边界。
是
Number
,在这些概念定义中永远不会起作用。NumVal
是原始类型的事实会影响您使用该类型的任何引用表达式的方式。当表达式中包含原始类型时,作为方法参数,作为方法调用目标等,该表达式的其他部分也将被删除。由于已将它们擦除,因此编译器无法保证表达式的类型安全,因此会警告您。规范中详细讨论了潜在问题:
What is a raw type and why shouldn't we use it?