什么是泛型的上界与下界
上界
用 extends
关键字声明,表示参数化的类型可能是所指定的类或者其任意子类。例如<? extends Fruit>
泛型的上界就是 Fruit 类
//泛型的上界就是 Fruit 类
ArrayList<? extends Fruit> fruitList = new ArrayList<Apple>();
下界
用 super
关键字声明,表示参数化的类型可能是所指定的类型或者其任意父类。例如<? super Apple>
,泛型的下界就是 Apple 类。
//泛型的下界就是 Apple 类
List<? super Apple> appleList = new ArrayList<Fruit>();
泛型的上界与下界的限制
-
上界的list只能get,不能add(确切地说不能add出除null之外的对象,包括Object)
-
下界的list只能add,不能get
规定了上界:
如果add添加对象,java不知道要为哪一个具体的类添加引用,但java不会自动选择;如果get对象,却可以(人为地)使用上界类创建引用了(因为代码中规定了上界,一看便知)。
规定了下界:
如果add添加对象,java不知道要为哪一个具体的类添加引用,这里就可以(人为地)添加下界类的子类对象了(因为代码中规定了下界,一看便知);如果get对象,只能用预获取的类的‘同类’或父类创建引用,但程序员不知道get出来的是哪个类。


示例代码:
import java.util.ArrayList;
import java.util.List;
class Fruit {}
class Apple extends Fruit {}
class Jonathan extends Apple {}
class Orange extends Fruit {}
public class CovariantArrays {
public static void main(String[] args) {
//上界
List<? extends Fruit> flistTop = new ArrayList<Apple>();
flistTop.add(null);
//add Fruit对象会报错
//flist.add(new Fruit());
Fruit fruit1 = flistTop.get(0);
//下界
List<? super Apple> flistBottem = new ArrayList<Apple>();
flistBottem.add(new Apple());
flistBottem.add(new Jonathan());
//get Apple对象会报错
//Apple apple = flistBottem.get(0);
}
}
网友评论