java - 了解 Java 泛型中的通配符

标签 java generics

我不确定为什么以下代码中的最后一条语句是非法的。 Integer 应该是 的子类型?,为什么我不能将它分配给 b

List<String> a = new ArrayList<String>();
a.add("foo");

// b is a List of anything
List<?> b = a;

// retrieve the first element
Object c = b.get(0);
// This is legal, because we can guarantee
// that the return type "?" is a subtype of Object

// Add an Integer to b.
b.add(new Integer (1)); 

最佳答案

重点是 b 引用了 some 类型的列表,但是编译器不知道类型是什么,所以它不会 知道向其添加Integer 是否有效。还有一件好事,给定您的示例 - 您将向最初创建的对象添加一个 Integer 以保存字符串列表。当然,在 Java 中,该信息在执行时会丢失 - 但编译器会尽力确保您的安全。

参见 Java generics FAQ获取更多信息。

关于java - 了解 Java 泛型中的通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8481052/

相关文章:

java - ExecutorService 未经检查的分配

c# - 允许推断模板

Java 通用问题 : cannot cast Map<K, V> 到 M extends Map<K, V>

java - 如果银行账户类别中遗漏了报表?

java - 使用 JAXB 将空列表编码为不存在的节点

java - 成本打印不正确

java - 限制Java子接口(interface)中的泛型类型

java - 微服务 - 如何使用授权服务器和资源服务器对注册流程进行建模?

java - 最新的 Java 分析器

swift - 无法使用某些参数创建实体