给定一个接口(interface),例如,
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>{
上面的声明引入了一个新的 generic类型名为 NumVal
. NumVal<Integer>
是 parameterization 的一个例子这种类型的。 NumVal
是 raw type .
删除C
其中,通过 JLS definition ,
The erasure of a type variable (§4.4) is the erasure of its leftmost bound.
是Number
, 从未在这些概念定义中发挥作用。
事实NumVal
是原始类型会影响您如何使用该类型的任何引用表达式。当表达式中涉及原始类型时,作为方法参数、方法调用目标等,表达式的其他部分也将被删除。由于它们被删除,编译器无法保证表达式的类型安全,因此会向您发出警告。
规范中详细讨论了潜在问题:
关于java - Java 泛型中的原始类型类与父类(super class)型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34295363/