Java泛型通配符

…衆ロ難τιáo~ 提交于 2020-02-02 19:30:37
class Fruit{}
class Apple extends Fruit{}
class Plate<T>{
    private T item;
    public Plate(){}
    public Plate(T t){
        item=t;
    }
    public void set(T t){
        item=t;
    }
    public T get(){
        return item;
    }
}
public class GenericTest {
    public static void main(String[] args) {
        Fruit a=new Fruit();
        Fruit b=new Apple();
        Plate<Fruit> c=new Plate<Fruit>();
        //Apple是Fruit的子类,但Plate<Apple>不是Plate<Fruit>的子类
        //Plate<Fruit> d=new Plate<Apple>();

        //? extends Fruit就代表Fruit或Fruit的子类
        Plate<? extends Fruit> e=new Plate<Apple>();
        Plate<? extends Fruit> f=new Plate<>();

        //无法set/add,类型不匹配,编译器不知道具体是在处理哪个子类。
        //e.set(new Fruit());
        //e.set(new Apple());
        Plate<? extends Fruit> g=new Plate<Apple>(new Apple());
        //可以get,可以强制转型为Fruit子类。
        Apple h= (Apple) g.get();
        Fruit i=g.get();

        //? super Fruit代表Fruit或Fruit的父类
        Plate<? super Fruit> j=new Plate<>();
        //可以set存入Fruit或Fruit的子类,会被统一成Fruit的某一个父类。
        j.set(new Fruit());
        j.set(new Apple());
        //可以get,但只能返回Object,因为不知道具体是哪个父类
        Object k= j.get();
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!