Java 泛型
更多内容,访问 IT-BLOG
一、为什么要有泛型
【1】解决元素存储的安全性问题。
【2】解决获取数据元素时,需要类型强转的问题。
二、泛型类
定义在类上的泛型是在创建对象时确定:
1 public class MyClass1<E> { 2 /** 定义具有泛型的类 3 * 修饰符 class 类名 <范型变量>{ 4 * 范型变量一般用E,K,V,T; 5 * } 6 */ 7 //...... 8 }
三、泛型接口
由实现类对象确定
四、泛型方法
创建在放方法上的泛型是在真正调用方法时确定,一般都由传入的参数确定,包含这个方法的类创建对象时,并不会确定方法上的类型,一定在调用方法时确定。
五、通配符<?>
统配符的使用如下:先说说T和?的区别:基本泛型T是用于定义,将数据类型参数化,不能用于实例化。而 ? 则是在实例化对象时不确定泛型具体参数类型的时候泛指 Object的所有子类型。 但?不能和 Object等效,?是类型实参而不是类型形参,它用于泛指各种类型实参,当具体类型不确定的时候就可以使用?示例如下:
六、上下界通配符
上下界通配符其实涉及到 Java 的多态属性,上下转型的可行性,子类实例可以转换成父类实例,但是父类实例却不一定能转换成子类实例,只有本身就是该子类实例向上转型的父类实例才可以向下转型为子类实例。
【1】<? extends A>:可以存放A 及其子类(带有子类限定的可以从泛型读取);
【2】<? super A>:可以存放A 及其父类(带有超类限定的可以从泛型写入),在泛型类中是不能进行 super 向上转型的。
那它有什么用呢?我们想一下,当我们想要创建一个
TreeSet<String> 类型的变量的时候,并传入一个可以比较 String 大小的Comparator。那么这个 Comparator 的选择就有很多了,它可以是
Comparator<String>,还可以是类型参数是 String 的父类,比如说
Comparator<Objcet>....这样做,就非常灵活了。也就是说,只要它能够比较字符串大小,就行了。
【界限通配符在集合】应用时会影响集合的读写行为:
【1】上界<? extends A> 限制了类型上限,只能向上转型,可以读,但是没法写,因为子类型不确定,没法向下转型;
【2】下界<? super A>限制类型的下限,只能向下转型,可以写,但是没法读,因为父类型不确定,没法向上转型。
七、注意事项
1)、静态方法中不能使用类的泛型。
2)、如果泛型类是一个接口或抽象类,则不可创建泛型类的对象。
3)、不能在 catch 中使用泛型。
4)、从泛型类派生子类,泛型类型需具体化。