java - Collections 类中 checkedList 方法的用途

标签 java generics

api 说“返回指定集合的​​动态类型安全 View ” 但是当泛型可以在编译时检测到是否有任何可疑的东西被插入到集合中时,仍然需要它。

文档说“语言中的泛型机制提供了编译时(静态)类型检查,但有可能通过未经检查的强制转换来破坏该机制

但即使这样也行不通

List<Integer> list = new ArrayList<Integer>();
Object o = new Float(1.2);
Integer i = (Integer)o; // line3
list.add(i);

但即使是这个也会在运行时失败并在第 3 行抛出 ClassCastException 因为 o 实际上持有一个 Float ,无法将其转换为 Integer 。所以,我想知道如何绕过静态编译时通用检查来证明 checkedList 方法的存在

最佳答案

这可以通过不使用泛型来完成,如果您使用的库是使用没有泛型的 Java 版本构建的,则可以做到这一点。

以下代码是如何使用泛型执行此操作的示例:

List<Integer> list = new ArrayList<Integer>();
List unsafeList = list; // Cast to a list that is not using generics
Object o = new Float(1.2);
unsafeList.add(o);
// list now contains a non Integer object.

这确实会产生几个警告,但您当然可以根据需要忽略这些警告。

关于java - Collections 类中 checkedList 方法的用途,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29388331/

相关文章:

java - 无法弄清楚我的通用 mergeSort、IndexOutBoundException 错误

swift - Swift 中的通用/多态搜索

java - 方法返回对象而不是在泛型方法中显式转换的类型

java - 如何将通用 bean 的属性绑定(bind)到动态创建的 swing 组件

java - 如何将 "Type type = new TypeToken<List<Mybean>>(){}.getType()"中的Mybean更改为参数?

generics - Swift 泛型运算符

java - 创建 bean 时出错,无法将新的 LinkedBlockingQueue 作为构造函数注入(inject)到 ThreadPoolExecutor

java - 如何在每个 GridView 单元格中插入多个项目

java - 为什么@PostConstruct 会导致NullPointerException?

java - 打印 JUnit 测试的输出