正如我们看到的, 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 代码
-
-
-
List<Integer> li = new
ArrayList<Integer>();
-
-
-
-
List l = li;
-
-
-
-
-
-
-
-
-
l.add("hello"
);
-
-
-
-
-
-
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 代码
-
-
-
List<Integer> li = new
ArrayList<Integer>();
-
-
-
-
List<Integer> cli = Collections.checkedList(li, Integer.class
);
-
-
-
-
List l = cli;
-
-
-
-
-
-
l.add("hello"
);
-
4.1.2.4 Arrays of generic type
分享到:
相关推荐
JDK 5.0 中增加的泛型类型,是 Java 语言中类型安全的一次重要改进。但是,对于初次使用泛型类型的用户来说,泛型的某些方面看起来可能不容易明白,甚至非常奇怪。在本月的“Java 理论和实践”中,Brian Goetz 分析...
介绍获取方法的参数和返回值类型(包括Type和Class)获取泛型参数类型(包括对象的泛型参数或集合元素的泛型类型)方法首先我们定义一个类:public cla
在"泛型类型转换Demo"中,可能涉及到不同泛型类型的赋值转换。例如,如果我们有一个`List<Number>`,我们可以通过类型转换将其赋值给`List<Integer>`,因为Integer是Number的子类。但是,这种转换只能在满足继承...
本文将深入探讨Java泛型类型擦除的概念,并介绍在类型擦除后,为了保持泛型的安全性和便利性,Java设计者所采取的一些补偿机制。 1. **类型擦除**: - 在编译期间,所有的泛型类型信息都会被替换为它们的实际类型...
提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具类. 提供调用getter/...
提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数.反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实...
本资源"**C#常用泛型类型.rar**"提供了关于C#中两种最常见的泛型类型——`Dictionary, TValue>`和`List<T>`的实例代码,这对初学者来说是极好的学习资料。下面将详细讲解这两个泛型容器以及它们在实际开发中的应用。...
这意味着在编译后,泛型类型信息会被消除,生成的字节码是不包含泛型的。尽管泛型在语法上和应用环境中与C++的模板类似,但其实现方式不同,主要是为了保持Java的向后兼容性和避免运行时的性能损失。 泛型不是协变...
泛型类型的写法1
Java 运行时如何获取泛型参数的类型 Java类型Type 之 ParameterizedType,GenericArrayType,TypeVariabl,WildcardType 从实现的接口获取泛型参数 定义一个泛型父类: public interface SuperClass { String ...
2. **丰富的元数据**:C#泛型类型包含元数据,使得我们可以利用反射技术来处理泛型类型。 3. **类型约束**:C#的泛型支持对类型参数进行约束,如基类约束、接口约束、构造函数约束以及值类型/引用类型约束,提高了...
`TypeNameFormatter`库就是为了帮助开发者解决这个问题,它提供了方便的方法来格式化并输出反射获取的泛型类型信息。在本文档中,我们将深入探讨`TypeNameFormatter`库的使用,以及如何在.NET框架,特别是针对MAUI...
在Java编程语言中,泛型(Generics)是一种强大的特性,它允许我们在编写代码时指定容器(如集合)可以存储的数据类型。这提高了代码的安全性和效率,因为编译器可以在编译时检查类型,避免了运行时...
dotnet 非泛型 类型 System.Collections.IEnumerable 不能与类型实参一起使用如果在开发的时候遇到非泛型 类型“IEnumer
2. **使用`KnownType`属性**:通过为`DataContract`类型添加`KnownType`属性来指定所有可能的泛型类型。这样,当序列化或反序列化时,WCF将能够正确处理这些类型。 例如,我们可以定义一个`EntityBase`接口,然后让...
泛型类型参数简介在定义泛型类型和泛型方法时,常用到泛型类型参数,泛型类型参数是在实例化泛型时指定类型的占位符。泛型类型参数放在“<>”内。泛型类型参数命名建议:(1)当泛型类型参数为单个字母时,建议用...
"泛型讲解 类型通配符" 泛型是Java语言中的一种机制,它允许在定义类、接口时指定类型形参,这个类型形参将在声明变量、创建对象时确定。泛型的引入解决了Java集合的缺陷,即集合会“忘记”对象的类型,导致...
在 Java 语言中,泛型类型擦除的机制使得开发者难以理解和使用泛型,例如,在 Java 中,我们可以定义一个泛型类 `ArrayList<T>`,其中 `T` 是类型参数,但是,在编译后的字节码文件中,泛型类型信息已经被擦除,所有...
上篇文章给大家介绍了浅析C# 中的类型系统(值类型和引用类型),接下来通过本文给大家介绍下c# 泛型类型, 说下C#中的泛型,熟练地使用泛型能提高代码的重用性,使用我们代码瞬间就高大上了,当然只有一点点,真的...