泛型,就是允许在定义类、接口、方法时使用类型形参,这个类型形参将在声明变量、创建对象、调用放法事动态地指定。
泛型存在的一个好处就是,如果我们不小心使用了其他非指定类型参数,在编译时期就能提醒。
泛型接口
public interface List<E> {
//在该接口中,E可作为任意类型使用
void add(E x);
Iterator<E> iterator();
...
}
泛型类
public class Apple<T> {
// 使用 T 类型形参定义实例变量
private T info;
// 使用 T 类型形参定义构造器
public Apple(T info){
this.info = info;
}
...
public static void main(String[] args){
// 传给 T 形参为 String 类型
Apple<String> a1 = new Apple<>("苹果");
// 传给 T 形参为 Double 类型
Apple<Double> a2 = new Apple<>(1.23);
}
}
经常看到泛型中的 E T V ? 等通配符不知道是什么含义,今天去查了一下。
类型通配符的含义
E ----- Element(元素 ,集合中使用)
T ----- Type(类型 ,类)
K ----- key(键)
V ----- Value(值)
N ----- Number(数值类型)
? ----- 不确定的java类型
<? extends T>
和 <? super T>
<? extends T>
表示类型的上界,参数类型是T或T的子类。
<? super T>
表示类型下界,参数类型是T或T的父类型。
如果频繁往外读取内容,适合用上界Extends。
如果频繁插入内容,适合用下界super。