List? unknownList;
List? extends Number unknownNumberList;
List? super Integer unknownBaseLineIntgerList;
注意: 在Java集合框架中 , 对于参数值是未知类型的容器类,只能读取其中元素,不能像其中添加元素,因为,其类型是未知,所以编译器无法识别添加元素的类型和容器的类型是否兼容,唯一的例外是NULL
ListString listString;
List? unknownList2 = listString;
unknownList = unknownList2;
listString = unknownList;//编译错误
4. 数组范型
可以使用带范型参数值的类声明数组 , 却不可有创建数组
ListInteger[] iListArray;
new ArrayListInteger[10];//编译时错误
5. 实现原理
5.1. Java范型时编译时技术,在运行时不包含范型信息,仅仅Class的实例中包含了类型参数的定义信息 。
泛型是通过java编译器的称为擦除(erasure)的前端处理来实现的 。你可以(基本上就是)把它认为是一个从源码到源码的转换,它把泛型版本转换成非泛型版本 。
基本上,擦除去掉了所有的泛型类型信息 。所有在尖括号之间的类型信息都被扔掉了 , 因此,比如说一个ListString类型被转换为List 。所有对类型变量的引用被替换成类型变量的上限(通常是Object) 。而且,无论何时结果代码类型不正确,会插入一个到合适类型的转换 。
T T badCast(T t, Object o) {
return (T) o; // unchecked warning
}
类型参数在运行时并不存在 。这意味着它们不会添加任何的时间或者空间上的负担,这很好 。不幸的是,这也意味着你不能依靠他们进行类型转换 。
5.2.一个泛型类被其所有调用共享
下面的代码打印的结果是什么?
ListString l1 = new ArrayListString();
ListInteger l2 = new ArrayListInteger();
System.out.println(l1.getClass() == l2.getClass());
或许你会说false,但是你想错了 。它打印出true 。因为一个泛型类的所有实例在运行时具有相同的运行时类(class),
而不管他们的实际类型参数 。
事实上,泛型之所以叫泛型,就是因为它对所有其可能的类型参数,有同样的行为;同样的类可以被当作许多不同的类型 。作为一个结果,类的静态变量和方法也在所有的实例间共享 。这就是为什么在静态方法或静态初始化代码中或者在静态变量的声明和初始化时使用类型参数(类型参数是属于具体实例的)是不合法的原因 。
5.3. 转型和instanceof
泛型类被所有其实例(instances)共享的另一个暗示是检查一个实例是不是一个特定类型的泛型类是没有意义的 。
Collection cs = new ArrayListString();
if (cs instanceof CollectionString) { ...} // 非法
类似的 , 如下的类型转换
CollectionString cstr = (CollectionString) cs;
得到一个unchecked warning,因为运行时环境不会为你作这样的检查 。
6. Class的范型处理
Java 5之后,Class变成范型化了 。
JDK1.5中一个变化是类 java.lang.Class是泛型化的 。这是把泛型扩展到容器类之外的一个很有意思的例子 。
现在,Class有一个类型参数T, 你很可能会问,T 代表什么?它代表Class对象代表的类型 。比如说,
String.class类型代表 ClassString , Serializable.class代表 ClassSerializable 。
这可以被用来提高你的反射代码的类型安全 。
特别的,因为 Class的 newInstance() 方法现在返回一个T, 你可以在使用反射创建对象时得到更精确的类型 。
比如说,假定你要写一个工具方法来进行一个数据库查询 , 给定一个SQL语句,并返回一个数据库中符合查询条件
的对象集合(collection) 。
推荐阅读
- 解谜游戏gorogoa,解谜游戏Gorogoa
- 面条店如何营销,面条店营销手段
- 魔力盒如何营销,魔力盒子
- csstextbox背景色,css文本框背景颜色
- go语言+数组比较方法 go byte数组
- 电商平台初期如何搭建,搭建电子商务平台
- dagama区块链,区块链dac是什么意思
- chatgpt取代硬件,gpu取代cpu
- vb.net变量加1 vb如何给变量赋值