java - 编译器如何区分 <? extends Number> from <Number> 当它们在类型删除后看起来都被编译成相同的东西时?

标签 java covariance type-erasure

我正在努力理解 java generic covariancy , 我明白为什么

List<Number> list = new ArrayList<Integer>();
Integer = list.get(0);

是不允许的,因此不会将 float 放入列表中并在以后引起问题。我相信类型删除会将其编译为:

List list = new ArrayList();
Integer = (Integer) list.get(0);

这是允许的:

List<? extends Number> list = new ArrayList<Integer>();
Integer = list.get(0);

在类型删除之后,这不会编译成同样的东西吗? 通配符如何帮助编译器强制不将包含整数的 float 放入列表中?

最佳答案

如果你有List<? extends Number> list ,您不能将任何内容放入结果列表中。您的列表是“包含一些扩展 Number 的对象的列表”,因此调用 add() with any argument 与此类型不兼容。所以这就是编译器控制您是否不放置 float 的方式:它不允许放置任何东西。

通常您将类型更改为 List<? extends Number>仅在您不再打算修改列表而只想阅读它的地方。

关于java - 编译器如何区分 <? extends Number> from <Number> 当它们在类型删除后看起来都被编译成相同的东西时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34846294/

相关文章:

java - 需要创建新的计划流程的建议

java - 由于 AccessibilityNodeInfo getChild 而导致大量 ANR

java - 绕过 Java/GWT 中的类型删除

java - 如何获取 Jackson ObjectMapper 的通用类型

java - JPA 持久保存与现有实体有关系的新实体

java - 使用 Google API 客户端库的 Http 请求

两个协变接口(interface)的 C# 协变问题

JAVA:类型参数隐藏类类型

c# - 使用 linq 表达式的协变/逆变

scala 类型删除和值类