泛型 类型

正如我们看到的, List<X> 不能被转化成 List<Y> ,尽管 X 能被转化成 Y 。但是 List<X> 能被转化成 List ,因此你可以通过这个方式处理遗留的代码(有那种泛型参数不能升级为泛型的代码)

This ability to convert parameterized types to nonparameterized types is essential for backward compatibility, but it does open up a hole in the type safety system that generics offer:

这种转化参数化类型为非参数化类型的能力是最基本的向后兼容,但这也给具有泛型的系统带来了一个类型安全漏洞。

java 代码
  1. // Here's a basic parameterized list.   
  2. // 这是一个基本的参数化类型类型的 list 。   
  3. List<Integer> li = new ArrayList<Integer>();  
  4.    
  5. // It is legal to assign a parameterized type to a nonparameterized variable   
  6. // 这样把一个参数化类型赋给一个非参数化类型变量是合法的。   
  7. List l = li;     
  8.    
  9. // This line is a bug, but it compiles and runs.   
  10. // The Java 5.0 compiler will issue an unchecked warning about it.   
  11. // If it appeared as part of a legacy class compiled with Java 1.4, however,   
  12. // then we'd never even get the warning.     
  13. // 这行是个 bug ,但是可以编译运行。   
  14. // Java 5.0 会发布一个 unchecked 警告信息   
  15. // 但是,如果用 Java 1.4 编译遗留的代码,不会有任何的警告。   
  16. l.add("hello" );  
  17.    
  18. // This line compiles without warning but throws ClassCastException at runtime.   
  19. // Note that the failure can occur far away from the actual bug.   
  20. // 这行编译没问题,但是会在运行时抛出 ClassCastException 异常   
  21. // 注意这个错误发现的地方,可能会远离它发生的实际位置   
  22. Integer i = li.get(0 );  

Generics provide compile-time type safety only. If you compile all your code with the Java 5.0 compiler and do not get any unchecked warnings, these compile-time checks are enough to ensure that your code is also typesafe at runtime. But if you have unchecked warnings or are working with legacy code that manipulates your collections as raw types, you may want to take additional steps to ensure type safety at runtime. You can do this with methods like checkedList() and checkedMap( ) of java.util.Collections. These methods enclose your collection in a wrapper collection that performs runtime type checks to ensure that only values of the correct type are added to the collection. For example, we could prevent the type safety hole shown above like this:

泛型仅提供了编译期的类型安全检查。如果你用 Java 5.0 编译代码并且没有任何的 unchecked 警告,那么这些编译的检查能够保证你的代码也在运行期是安全的。但是如果你收到 unchecked 警告,或是用了遗留下来的代码(用原始的类型操作Collection),你可能想用些附加的步骤来确保运行期的类型安全。你可以用 java.util.Collections 的这些方法 checkedList() 和 checkedMap() 来做。这些方法封装你的Collection到一个包装的Collection中,它执行运行期的检查确保正确类型的值被加入到你的Collection 中。例如,我们可这样阻止类型安全的漏洞:

java 代码
  1. // Here's a basic parameterized list.   
  2. // 这是一个基本的参数化类型的 list 。   
  3. List<Integer> li = new ArrayList<Integer>();  
  4.    
  5. // Wrap it for runtime type safety   
  6. // 为了运行期的安全,我们包装了它   
  7. List<Integer> cli = Collections.checkedList(li, Integer.class );  
  8.    
  9. // Now widen the checked list to the raw type   
  10. // 现在放到这个 checked 的 list 到原始类型   
  11. List l = cli;     
  12.    
  13. // This line compiles but fails at runtime with a ClassCastException.   
  14. // 这行可编译,但是运行期会抛出 ClassCastException 异常。   
  15. // The exception occurs exactly where the bug is, rather than far away   
  16. // 这个异常能够定位 bug 的位置,而不是远离它实际的位置   
  17. l.add("hello" );  
  18.    


4.1.2.4 Arrays of generic type

你可能感兴趣的:(UP)