您好,欢迎访问一九零五行业门户网

java泛型中的上界(extend)和下界(super)

泛型中上界和下界的定义
上界 <? extend fruit>
下界 <? super apple>
上界和下界的特点
上界的list只能get,不能add(确切地说不能add出除null之外的对象,包括object)
下界的list只能add,不能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);  }}
这些特点的原因
上界 <? extend fruit> ,表示所有继承fruit的子类,但是具体是哪个子类,无法确定,所以调用add的时候,要add什么类型,谁也不知道。但是get的时候,不管是什么子类,不管追溯多少辈,肯定有个父类是fruit,所以,我都可以用最大的父类fruit接着,也就是把所有的子类向上转型为fruit。
下界 <? super apple>,表示apple的所有父类,包括fruit,一直可以追溯到老祖宗object 。那么当我add的时候,我不能add apple的父类,因为不能确定list里面存放的到底是哪个父类。但是我可以add apple及其子类。因为不管我的子类是什么类型,它都可以向上转型为apple及其所有的父类甚至转型为object 。但是当我get的时候,apple的父类这么多,我用什么接着呢,除了object,其他的都接不住。
所以,归根结底可以用一句话表示,那就是编译器可以支持向上转型,但不支持向下转型。具体来讲,我可以把apple对象赋值给fruit的引用,但是如果把fruit对象赋值给apple的引用就必须得用cast
以上就是java泛型中的上界(extend)和下界(super)的详细内容。
其它类似信息

推荐信息