一.泛型的好处:
理解Java泛型最简单的方法是把它看成一种便捷语法,节省类型转换的代码
二.协变:
在数组中协变是支持的,Apple[]可以复制给Fruit[].但是在泛型中是不支持协变的,List<Apple>是不能复制给List<Fruit>,例如:
take(List<Fruit> fruits){}//只有真正的List<Fruit>才能调用take(..),Fruit的子类是无法调用的
解决办法:take(List<? extends Fruit> fruits){
fruits.add(new Apple());//编译出错,只能进行读,不能进行写操作,因为List内的具体类型是不确定的
}//Fruit的子类是都可以调用
三.擦除:
泛型其实只是在编译器中实现的而虚拟机并不认识泛型类项,所以要在虚拟机中将泛型类型进行擦除。也就是说,在编译阶段使用泛型,运行阶段取消泛型,即擦除。
List<Integer>,List<String>
1.在java中编译器只生成唯一的一份目标代码List类,该泛型类的所有实例都映射到这份目标代码上,在需要的时候执行类型检查和类型转换。
2.在实例化一个泛型类或泛型方法时都产生一份新的目标代码,针对Integer,String类型的两个List类
擦除带来的问题:
public class Erased<T>{
private T[] arr;
public Erased(){
T t = new T();//illegal因为在编译的时候不知道构造哪个具体的类
arr = new T[1];//illegal
arr = (T[])new Object[1];//Unchecked warning
}
public void doSomething(Set<?> set){
Set<?> copy = new HashSet<?>(set);//illegal
Set<?> copy2 = new HashSet<Object>(set);//合法
}
}
解决办法:public class Erased<T>{
private T[] arr;
private Class<T> type;
public Erased(Class<T> type){
this.type = type;
Class<T>[] arrs = new Class[1];//方法一
arr = (T[])arrs;
//arr = (T[])Array.newInstance(type,1);//方法二
}
}
四.限制泛型中类型参数的范围:
<K extends String>和<V super Integer>
不是表示继承和超类,而是表示类型的范围,表示K<=Sting,V>=Integer
class C<T extends Comparable<? super T> & Serializable>
我们来分析以下这句,T extends Comparable这个是对上限的限制,Comparable<? super T>这个是下限的限制,Serializable是第2个上限。一个指定的类型参数可以具有一个或多个上限。具有多重限制的类型参数可以用于访问它的每个限制的方法和域。
总结 ? extends 和 the ? super 通配符的特征,我们可以得出以下结论:
•如果你想从一个数据类型里获取数据,使用 ? extends 通配符
•如果你想把对象写入一个数据结构里,使用 ? super 通配符
•如果你既想存,又想取,那就别用通配符。
分享到:
相关推荐
JDK1.5泛型讲解 不错的东西 对jdk需要研究的朋友不妨看看 新手也来学习学习```
标题:“jdk1.5 windows版本 64位” 描述:“jdk1.5 windows版本 64位,Java开发依赖环境” 标签:“windows” 在这个主题中,我们聚焦的是Oracle JDK 1.5(也被称为Java Development Kit,简称JDK)在Windows...
Java泛型是在JDK 1.5版本中引入的一项重要特性,极大地增强了类型安全性和代码可读性。泛型允许开发者在类、接口和方法中声明类型参数,从而实现对数据类型的抽象。在泛型的帮助下,开发者可以在编译时进行类型检查...
**Java泛型是JDK1.5引入的一个重要特性,极大地提高了代码的类型安全性和重用性。在泛型出现之前,程序员需要在运行时进行强制类型转换,这可能导致ClassCastException。泛型通过在类、接口和方法声明中引入类型参数...
JDK1.5的泛型实现.pdf
**JDK 1.5 泛型实现** Java Development Kit (JDK) 1.5 是一个里程碑式的版本,因为它引入了泛型,这是一项重要的编程特性,极大地提高了代码的类型安全性和可读性。泛型允许在编译时进行类型检查,避免了运行时...
其次,泛型(Generics)是JDK1.5的一大亮点。泛型允许在定义类、接口和方法时指定参数类型,增强了类型检查,减少了类型转换的麻烦,同时也减少了运行时的类型错误。泛型还引入了通配符,如"? extends T"和"? super ...
JDK1.5引入了一些重要的特性,如增强的for循环(foreach)、匿名内部类的改进、枚举类型以及泛型的初步支持。这些特性对Java编程产生了深远影响,提升了代码的可读性和安全性。 然而,由于JDK1.5已不再受官方支持,...
绝版jdk1.5,非常不错的资源。用起来很好。是 Java语言对Bean类属性、事件的一种缺省处理方法。例如类A中有属性name,那我们可以通过getName,setName来得到其值或者设置新 的值。通过getName/setName来访问name属性,...
JDK1.5,也称为Java 5.0,是一个重要的版本,它引入了许多新的特性和改进,对Java语言的发展产生了深远影响。 一、泛型(Generics) 在Java 5.0中,最重要的特性之一就是泛型的引入。泛型允许开发者在定义类、接口...
这个压缩包包含了三个不同版本的JDK:JDK 1.5、JDK 1.6和JDK 1.8,其中1.5和1.6是早期版本,而1.8是最流行且广泛使用的版本之一。 **JDK 1.5(也称为Java 5.0)** JDK 1.5在2004年发布,引入了许多重要的新特性,如...
标题中的"window JDK1.5 32位 绿色免安装版"指的是适用于Windows操作系统的32位版本的JDK 1.5,它是一个便携式版本,无需正式安装即可使用。这种绿色免安装版通常是为了方便开发者在不同机器间快速切换工作环境,或...
今天,JDK1.5終於內建泛型特性,不僅編譯器不再需要 任何外力(外掛附件)的幫助,整個 Java標準程式庫也被翻新(retrofit),許多 角落針對泛型做了改寫。 讓我們把帶有「參數化型別」(parameterized types)的 ...
JDK1.5(zh_CN)精简版是针对中文用户的定制版,包含了Java 5的所有重要更新和优化,同时提供中文界面和文档,便于中国开发者理解和使用。通过这个版本,开发者可以学习和利用这些新特性,提升开发效率,写出更加健壮...
前几天上传过这个资源,因为是在jdk1.6上开发的, 测试了一下在jdk1.5上不能用, 今天重新用jdk1.5编译了一下, 这个是可以支持jdk1.5+的 将 pu-xlscommon-1.0.0.jar 添加到工程的 /lib 目录下 用法在附件中 XlsTest....
JDK1.5,全称Java Development Kit 1.5,是Java平台标准版(Java SE)的一个重要版本,由Sun Microsystems在2004年9月30日正式发布。这个版本引入了大量的新特性,对Java编程语言进行了重大改进,极大地提升了开发...
JDK1.5 全平台安装包下载 百度网盘资源 jdk-1_5_0_22-linux-amd64-rpm.bin jdk-1_5_0_22-linux-amd64.bin jdk-1_5_0_22-linux-i586-rpm.bin jdk-1_5_0_22-linux-i586.bin jdk-1_5_0_22-solaris-amd64...
jdk1.5.exe jdk1.5 jdk1.5下载
测试可用的linux版jdk1.5,jdk-1_5_0_19-linux-i586-rpm.bin
Java泛型是自JDK 1.5版本引入的一项重要特性,它极大地提高了代码的类型安全性和重用性。在本教程中,我们将深入探讨Java...通过阅读“JDK1.5的泛型实现.pdf”这份文档,你应该能更深入地理解泛型的细节和实际应用。