Java Collections.checked*()vs Generic collections

shr*_*000 5 java generics collections

Java的Collections.checked*()api为我们提供了基础集合的类型安全视图.但是这些检查在运行时发生,并引发运行时异常,这对性能来说代价很高.通过使用泛型集合为这些集合提供特定类型,可以在编译时强制执行相同的类型检查.那么有些情况下Collections.checked*()会对指定类型的泛型集合进行评分吗?

dev*_*ole 10

javadoc解释得很好:

http://download.oracle.com/javase/6/docs/api/java/util/Collections.html#checkedCollection%28java.util.Collection,%20java.lang.Class%29

语言中的泛型机制提供了编译时(静态)类型检查,但是可以使用未经检查的强制转换来破坏此机制.通常这不是问题,因为编译器会对所有此类未经检查的操作发出警告.但是,有时单独进行静态类型检查是不够的.例如,假设一个集合被传递给第三方库,并且库代码必须通过插入错误类型的元素来破坏集合.


Joa*_*uer 6

主要区别在于,编译时检查很容易被意外和有意识地规避.

如果发生这种情况,编译器发出警告,但警告很容易被忽略,问题可能发生在某个库的某个地方.泛型提供的类型信息可靠的,但只有在涉及的所有代码编译时都没有任何与泛型相关的警告:没有未经检查的强制转换,没有原始类型.

使用Collections.checked*()为您提供了一种强制执行限制的方法,即使使用了您无法控制的代码(只要您可以传入自己的集合).