`
xubindehao
  • 浏览: 243314 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

泛型 类型

UP 
阅读更多

正如我们看到的, 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

分享到:
评论

相关推荐

    JDK 5.0中的泛型类型学习

    JDK 5.0 中增加的泛型类型,是 Java 语言中类型安全的一次重要改进。但是,对于初次使用泛型类型的用户来说,泛型的某些方面看起来可能不容易明白,甚至非常奇怪。在本月的“Java 理论和实践”中,Brian Goetz 分析...

    looly#hutool-site#泛型类型工具-TypeUtil1

    介绍获取方法的参数和返回值类型(包括Type和Class)获取泛型参数类型(包括对象的泛型参数或集合元素的泛型类型)方法首先我们定义一个类:public cla

    泛型类型转换Demo

    在"泛型类型转换Demo"中,可能涉及到不同泛型类型的赋值转换。例如,如果我们有一个`List&lt;Number&gt;`,我们可以通过类型转换将其赋值给`List&lt;Integer&gt;`,因为Integer是Number的子类。但是,这种转换只能在满足继承...

    Java泛型类型擦除后的补偿

    本文将深入探讨Java泛型类型擦除的概念,并介绍在类型擦除后,为了保持泛型的安全性和便利性,Java设计者所采取的一些补偿机制。 1. **类型擦除**: - 在编译期间,所有的泛型类型信息都会被替换为它们的实际类型...

    java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class

    提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具类. 提供调用getter/...

    java 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class

    提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数.反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实...

    C#常用泛型类型.rar

    本资源"**C#常用泛型类型.rar**"提供了关于C#中两种最常见的泛型类型——`Dictionary, TValue&gt;`和`List&lt;T&gt;`的实例代码,这对初学者来说是极好的学习资料。下面将详细讲解这两个泛型容器以及它们在实际开发中的应用。...

    JDK 5.0中的泛型类型学习.docx

    这意味着在编译后,泛型类型信息会被消除,生成的字节码是不包含泛型的。尽管泛型在语法上和应用环境中与C++的模板类似,但其实现方式不同,主要是为了保持Java的向后兼容性和避免运行时的性能损失。 泛型不是协变...

    泛型类型的写法

    泛型类型的写法1

    Java如何获取泛型类型

    Java 运行时如何获取泛型参数的类型 Java类型Type 之 ParameterizedType,GenericArrayType,TypeVariabl,WildcardType 从实现的接口获取泛型参数 定义一个泛型父类: public interface SuperClass { String ...

    .NET/C#如何判断某个类是否是泛型类型或泛型接口的子类型详解

    2. **丰富的元数据**:C#泛型类型包含元数据,使得我们可以利用反射技术来处理泛型类型。 3. **类型约束**:C#的泛型支持对类型参数进行约束,如基类约束、接口约束、构造函数约束以及值类型/引用类型约束,提高了...

    dotnet 使用 TypeNameFormatter 库格式化输出反射泛型类型.rar

    `TypeNameFormatter`库就是为了帮助开发者解决这个问题,它提供了方便的方法来格式化并输出反射获取的泛型类型信息。在本文档中,我们将深入探讨`TypeNameFormatter`库的使用,以及如何在.NET框架,特别是针对MAUI...

    java 泛型类的类型识别示例

    在Java编程语言中,泛型(Generics)是一种强大的特性,它允许我们在编写代码时指定容器(如集合)可以存储的数据类型。这提高了代码的安全性和效率,因为编译器可以在编译时检查类型,避免了运行时...

    lindexi#lindexi.github.io#dotnet 非泛型 类型 System.Collections.IEnum

    dotnet 非泛型 类型 System.Collections.IEnumerable 不能与类型实参一起使用如果在开发的时候遇到非泛型 类型“IEnumer

    WCF中应用泛型

    2. **使用`KnownType`属性**:通过为`DataContract`类型添加`KnownType`属性来指定所有可能的泛型类型。这样,当序列化或反序列化时,WCF将能够正确处理这些类型。 例如,我们可以定义一个`EntityBase`接口,然后让...

    c# 泛型类型参数与约束的深入分析

    泛型类型参数简介在定义泛型类型和泛型方法时,常用到泛型类型参数,泛型类型参数是在实例化泛型时指定类型的占位符。泛型类型参数放在“&lt;&gt;”内。泛型类型参数命名建议:(1)当泛型类型参数为单个字母时,建议用...

    泛型讲解 类型通配符

    "泛型讲解 类型通配符" 泛型是Java语言中的一种机制,它允许在定义类、接口时指定类型形参,这个类型形参将在声明变量、创建对象时确定。泛型的引入解决了Java集合的缺陷,即集合会“忘记”对象的类型,导致...

    解析Java泛型的类型擦除.pdf

    在 Java 语言中,泛型类型擦除的机制使得开发者难以理解和使用泛型,例如,在 Java 中,我们可以定义一个泛型类 `ArrayList&lt;T&gt;`,其中 `T` 是类型参数,但是,在编译后的字节码文件中,泛型类型信息已经被擦除,所有...

    深入浅析C#泛型类型

    上篇文章给大家介绍了浅析C# 中的类型系统(值类型和引用类型),接下来通过本文给大家介绍下c# 泛型类型, 说下C#中的泛型,熟练地使用泛型能提高代码的重用性,使用我们代码瞬间就高大上了,当然只有一点点,真的...

Global site tag (gtag.js) - Google Analytics