Java 通过Collections类的算法获取集合的“动态类型安全视图”

Java 通过Collections类的算法获取集合的“动态类型安全视图”,java,generics,collections,Java,Generics,Collections,我引用了赫伯特·席尔德(Herbert Schildt)关于Java的书中的话 需要特别注意的是一套检查方法, 例如checkedCollection,它返回API文档 称为集合的“动态类型安全视图”。这一观点 是对集合的引用,该集合监视插入到 运行时类型兼容性的集合。试图插入 不兼容的元素将导致ClassCastException。使用这样的 视图在调试期间特别有用,因为它可以确保 集合始终包含有效元素。 相关方法包括checkedSet、checkedList、checkedMap和 等等。

我引用了赫伯特·席尔德(Herbert Schildt)关于Java的书中的话

需要特别注意的是一套检查方法, 例如checkedCollection,它返回API文档 称为集合的“动态类型安全视图”。这一观点 是对集合的引用,该集合监视插入到 运行时类型兼容性的集合。试图插入 不兼容的元素将导致ClassCastException。使用这样的 视图在调试期间特别有用,因为它可以确保 集合始终包含有效元素。 相关方法包括checkedSet、checkedList、checkedMap和 等等。它们为指定的集合获取类型安全视图

在泛型之前,代码不是类型安全的,其误用可能导致运行时异常。泛型可以防止这种情况发生。本质上,通过泛型,曾经的运行时错误变成了编译时错误。这是一大优势。在这个过程中,它们消除了我手工输入类型转换和键入检查代码的需要

那么,为什么需要在运行时监控插入到集合中的类型兼容性,而在编译时通过使用泛型显然可以做到这一点,为什么需要检查方法呢


作者所说的集合的“动态类型安全视图”是什么意思?

因为尽管有泛型,但可以通过原始方法发送它们,但仍然会出现运行时错误。下面是一个例子:

public void addUnrelatedInfo(List list) {
    list.add(5);
}

//...
List<String> stringList = new ArrayList<>();
stringList.add("hello");
addUnrelatedInfo(stringList);
stringList.add("world");
System.out.println(stringList);
正如您所看到的,它只是碰巧使用了一个接收原始接口/集合的方法,您的代码可能会失败

问题不在于考虑创建这种奇怪的方法,而是有些库是Java1.4兼容的,它们的接口采用参数原始类型

[ hello, 5, world ]