java泛型-类型通配符
类型通配符
- 类型通配符一般是用“?”代替具体的类型实参
- 所以,类型通配符是类型实参,而不是类型形参
通配符的上限
-
语法
类/接口 <? extends 实参类型>
要求该泛型的类型,只能是是实参类型,或实参类型的子类型 -
代码示例
//bean对象,泛型类
public class Box<E> {
private E first;
public E getFirst() {
return first;
}
public void setFirst(E first) {
this.first = first;
}
}
public class TestUp {
//这里list的无法添加list1
public static void showBox(List<? extends Number> list) {
List<Number> list1 = new ArrayList<>();
// list.addAll(list1);
// list.add(n2);
}
//这里list1可以添加list
public static void showBox(Collection<? extends Number> list) {
List<Number> list1 = new ArrayList<>();
list1.addAll(list);
// list.addAll(list1);
}
}
通配符的下限
-
语法
类/接口 <? super实参类型>
要求该泛型的类型,只能是是实参类型,或实参类型的父类类型 -
代码示例
//泛型下限示例
public class TestDown {
public static void main(String[] args) {
ArrayList<Animal> arrayList1 = new ArrayList<>();
ArrayList<Cat> arrayList2 = new ArrayList<>();
ArrayList<miCat> arrayList3 = new ArrayList<>();
showAnimal1(arrayList1);
showAnimal1(arrayList2);
//由于下限是Cat,所以miCat不能操作
// showAnimal1(arrayList3);
}
public static void showAnimal1(List<? super Cat> list) {
}
}
class Animal {
public String name;
public Animal(String name) {
super();
this.name = name;
}
}
class Cat extends Animal {
public Cat(String name) {
super(name);
}
}
class miCat extends Cat {
public miCat(String name) {
super(name);
}
}
类型擦除
- 泛型是java1.5版本才引进的概念,在这之前都是没有泛型的,但是,泛型代码能够很好的和之前版本的代码兼容。那是因为,泛型信息只存在于代码编译阶段,在进入JVM之前,与泛型相关的信息都会被擦除掉,我们称之为—类型擦除。