我引用了Herbert Schildt关于Java的书,


  要特别注意的一件事是一组检查方法,
      例如checkedCollection( ),它返回API文档的内容
      称为集合的“动态类型安全视图”。这个观点
      是对集合的引用,该集合监视对
      在运行时进行类型兼容性的collection。尝试插入
      不兼容的元素将导致ClassCastException。使用这样
      视图在调试期间特别有用,因为它可以确保
      集合始终包含有效元素。
      相关方法包括checkedSet( )checkedList( )checkedMap( )
      以此类推。它们为指示的集合获得类型安全的视图。


在泛型之前,该代码不是类型安全的,滥用该代码可能会导致运行时异常。泛型可防止这种情况发生。本质上,通过泛型,曾经是运行时错误的东西已经变成了编译时错误。这是一个主要优点。在此过程中,他们消除了我手动输入强制类型验证和键入代码的需要。

那么,为什么在运行时需要监视集合中的插入以确保类型兼容性,为什么在编译时通过使用泛型就可以清楚地实现插入,以及为什么需要经过检查的方法呢?

作者collection的“动态类型安全视图”是什么意思?

最佳答案

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

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);


然后您得到以下输出:

[ hello, 5, world ]


如您所见,它只是碰巧使用了一种接收原始接口/集合的方法,因此您的代码可能注定了失败。

问题不在于您在考虑创建这种奇怪的方法,而是有一些与Java 1.4兼容的库,它们的接口作为参数原始类型。

09-10 10:08
查看更多