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实际上仅仅是限定了一个类型而已,主要就是一个类型转换问题,只要你的类型是符合标准的,是无二义的,就能通过编译器编译。当然,上面所说的存数据取数据之类,代码能很好证明,不存在限制,只是类型转换的时候会出现一些问题罢了。
全靠自己判断,知道基本的含义就行。