java-关于泛型 ? extends A 和 ? super A的理解

1.? extends A,即A的任意子类,包括A,如果写成象限的话,应该算是(?, A]。

这种类型可以取出,不能添加。

原因是:我们并不知道? extends A是A的哪一个子类,因此,我们并不能随意的将一个对象添加进去,即使这个对象的类是A的子类之一或者是A类的对象。但是我们可以取出,我们知道这里面的所有的对象都是A的子类的对象,所以,都能转化成为A类的对象。

代码(被注释掉的是错误的部分):

import java.util.ArrayList;
public class Main {
    public static void main(String[] args) throws Exception {
        ArrayList arrayList = new ArrayList();
        arrayList.add(new A());
        arrayList.add(new String("jkl"));
        arrayList.add(new B());
        ArrayList<? extends A> arrayList11 = arrayList;
        //arrayList11.add(new B());
        //arrayList11.add(new A());
        System.out.println(arrayList.get(1));
        //java.lang.String s = (java.lang.String) arrayList11.get(1);
        A a = (A) arrayList.get(0);
    }
}
class A {}
class B extends A {}

2.? super A代表A的任意父类,包括A,如果写成象限的话是[A, Object],这个上界最多Object,不能再多了哈哈哈。他能够存数据,也能取出数据。

原因是:我们虽然不知道这个类的具体类型,但是我们至少可以知道,可以将A和A的子类存储进去;但是我们不知道这是A的哪一个父类,但是我们知道他是Object,所以我们也能将数据取出。

代码:

import java.util.ArrayList;
public class Main {
    public static void main(String[] args) throws Exception {
        ArrayList arrayList = new ArrayList();
        arrayList.add(new A());
        arrayList.add(new String("jkl"));
        arrayList.add(new B());
        ArrayList<? super A> arrayList1 = arrayList;
        arrayList1.add(new A());
        arrayList1.add(new B());
        arrayList.add(new Object());
        arrayList.add(new String());
        System.out.print(arrayList.get(1));
        Object o = arrayList.get(0);
        A a = (A) o;
    }
}
class A {}
class B extends A {}

 

总结:从广义上来说,? extends A和? super A实际上仅仅是限定了一个类型而已,主要就是一个类型转换问题,只要你的类型是符合标准的,是无二义的,就能通过编译器编译。当然,上面所说的存数据取数据之类,代码能很好证明,不存在限制,只是类型转换的时候会出现一些问题罢了。

全靠自己判断,知道基本的含义就行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值