[Java]泛型的extends和super

[Java]泛型的extends和super

代码

import java.util.*;

public class T1 {
    static class View {}
    static class ViewGroup extends View {}
    static class LinearLayout extends ViewGroup {}
    static class MyLayout extends LinearLayout {}
    static class FrameLayout extends ViewGroup {}
    public static void main(String[] args) {
        List view1 = new ArrayList();// 可以传递的泛型是 ViewGroup LinearLayout MyLayout FrameLayout
        view1.add(null);
        view1.add(new Object());//compile error
        view1.add(new View());//compile error
        view1.add(new ViewGroup());//compile error
        view1.add(new LinearLayout());//compile error
        view1.add(new MyLayout());//compile error
        view1.add(new FrameLayout());//compile error
        ViewGroup v = view1.get(0);

        //下界
        List view2 = new ArrayList();//可以传递的泛型是 Object View ViewGroup
        view2.add(null);
        view2.add(new Object());//compile error
        view2.add(new View());//compile error
        view2.add(new ViewGroup());
        view2.add(new LinearLayout());
        view2.add(new MyLayout());
        view2.add(new FrameLayout());
        Object object = view2.get(0);
    }

    public static void test1(List v) {
        ViewGroup vg = v.get(0);
    }

    public static void test2(List v) {
        ViewGroup vg = v.get(0);
    }

    public static void test3(ViewGroup vg) {

    }
}

view1 的泛型为,那么它可以接受的值可以是

new XXXList();
new XXXList();//LinearLayout 继承自ViewGroup
new XXXList();//MyLayout 继承自LinearLayout
new XXXList();//FrameLayout 继承自VewGroup

但是view1 调用add就会全部出错。

比如view1.add(new ViewGroup());,虽然泛型为,但是view1的值是不能够确定,因为它还可以是new XXXList();,父类不能够转换成子类,只能子类转换成父类,同样的,传递LinearLayout 也不行,因为view1 的值也可能是new XXXList();,其他的同理。至于ObjectView 本来就不太行。

view2的泛型为,那么它可以接受的值可以是

new XXXList();
new XXXList();
new XXXList();
 
 

现在我们调用view2.add(new Object());,虽然view2可能是new XXXList();,但它也可能是new XXXList();,所以不成功。同理,调用view2.add(new View());,也不行。

但是view2.add(new ViewGroup());和后面的都可以。因为,不管view2的值是上面3种中的哪一种值,都可以进行安全的转换即子类转换成父类。

比如传递一个对象,类型是LinearLayout
view2=new XXXList();没有问题,因为LinearLayout可以转换成Object,
view2=new XXXList();也没有问题,因为LinearLayout也可以转换成View
view2=new XXXList();也没有问题,因为LinearLayout也可以转换成ViewGroup

但是传递View就不行了,view2也可能是new XXXList();。虽然在view2=new XXXList();时可行,但是view2也可能时new XXXList();。所以这个可能会出现问题,不可行。

使用

查看上面的代码,view1几乎是“不可写”,不管你传递哪个都不行,它到底有什么用?它的用处主要在参数传递,比如上面的test1(List fruits) ,我可以传递的值为

new XXXList();
new XXXList();
new XXXList();
new XXXList();

但是,test2(List v)就只能够传递new XXXList()

你可能感兴趣的:([Java]泛型的extends和super)