java - Java 泛型中的原始类型类与父类(super class)型类

标签 java generics raw-types

给定一个接口(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 的一个例子这种类型的。 NumValraw 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/

相关文章:

c# - 访问通用实例属性

java - MongoDB:注册编解码器 (Java)

java - jlink 图像中的区域设置 getDisplayLanguage 损坏

java - var<T> 在 Java 中做了什么?

ios - 函数中具有相互递归关联类型约束的 Swift 协议(protocol)

java - 用 Class< 替换 Class 是好习惯吗?扩展 Object> 以避免警告?

java - 什么是原始类型,为什么我们不应该使用它呢?

java - 非必需的 1 到 1 映射的 Hibernate 投影/延迟加载

java - Java ACM 中的凯撒密码

java - 什么是原始类型,为什么我们不应该使用它?