Java中 的總結#


class Food{}

//Lev 2
class Fruit extends Food{}

//Lev 3
class Apple extends Fruit{}
class Banana extends Fruit{}
//Lev 4
class RedApple extends Apple{}
class Plate<T>{
    private T item;
    public Plate(T t){item=t;}
    public void set(T t){item=t;}
    public T get(){return item;}
}
  • <? extends T>:是指 “上界通配符(Upper Bounds Wildcards)”
  • 不能往里存,只能往外取,set( )方法失效。但取東西get( )方法還有效並且讀取出來的東西只能存放在Fruit或它的基類里甚至Object
  • Plate<? extends Fruit> p=new Plate<Apple>(new Apple());

    p.set(null);

    //不能存入任何元素

    p.set(new Fruit());    //Error

    p.set(new Apple());    //Error

    Object object=p.get();

    Food food=p.get();

    Fruit fruit=p.get();

    Apple apple=p.get();    //Error

    RedApple redApple=p.get();    //Error

    Banana banana=p.get();    //Error

  •  對於集合少許不一樣的地方

    List<? extends Fruit> list1; // list1 的元素在賦值的類型只能是 C 和 C 的子類。

    ArrayList<Food> a = new ArrayList<>();

    ArrayList<Fruit> b = new ArrayList<>();

    ArrayList<Apple> c = new ArrayList<>();

    ArrayList<Banana> d = new ArrayList<>();

    ArrayList<RedApple> e = new ArrayList<>();

    list1 = a; // 報錯

    list1 = b;

    list1 = c;

    list1 = d;

    list1 = e;

    Object object = list1.get(0);

    Food food = list1.get(0);

    Fruit fruit = list1.get(0);

    Apple apple = list1.get(0);// 報錯

    RedApple red = list1.get(0);// 報錯

    Banana banana = list1.get(0);// 報錯

    add():編譯器只知道類型是 Fruit 或 Fruit 的子類,所以有可能是 Fruit Apple RedApple Banana 其中一個類型,為保證類型安全不能添加除了 null 以外的任何元素,即使是 Fruit 本身也不行。

    get():既然編譯器不知道此時集合中的元素是Fruit Apple RedApple Banana 的哪一個,返回類型只能是他們共同父類 Fruit 或者父類Food類甚至Object。

  • <? super T>:是指 “下界通配符(Lower Bounds Wildcards)”
  • 不影響往里存,set( )方法正常。但往外取只能放在Object,對象里get( )方法部分失效,只能存放到Object對象里。

    Plate<? super Fruit> p=new Plate<Fruit>(new Fruit());

    //存入元素正常

    p.set(new Fruit());

    p.set(new Apple());

    p.set(new Apple());

    p.set(new Banana());

    //讀取出來的東西只能存放在Object類里。

    Object object=p.get();

    Food food=p.get();    //Error

    Fruit fruit=p.get();    //Error

    Apple apple=p.get();    //Error

    Banana banana=p.get();    //Error

  •  對於集合少許不一樣的地方

    List<? super Fruit> list2; // list2 的元素在賦值的類型只能是 Fruit和 Fruit 的父類。

    ArrayList<Object> o = new ArrayList<>();

    ArrayList<Food> a = new ArrayList<>();

    ArrayList<Fruit> b = new ArrayList<>();

    ArrayList<Apple> c = new ArrayList<>();

    ArrayList<Banana> d = new ArrayList<>();

    ArrayList<RedApple> e = new ArrayList<>();

    list2 = o; 

    list2 = a; 

    list2 = b;

    list2 = c; // 報錯

    list2 = d; // 報錯

    list2 = e;// 報錯

     

    list2.add(new Object());// 報錯

    list2.add(new Food());// 報錯

    list2.add(new Fruit());

    list2.add(new Apple());

    list2.add(new Banana());

    list2.add(new RedApple());

     

    Object objectL = list2.get(0);

    Food foodL = list2.get(0);

    Fruit fruitL = list2.get(0);

    Apple appleL = list2.get(0);// 報錯

    RedApple redL = list2.get(0);// 報錯

    Banana bananaL = list2.get(0);// 報錯

  • add():編譯器只知道類型是 Fruit 或者 Fruit 的父類,所以有可能是 Fruit Object其中一個類型。編譯器知道下界是 Fruit ,根據類型向上兼容所以可以添加的元素是 Fruit 以及 Fruit 的子類

    get():既然編譯器不確定集合類型是 Fruit Object 的哪一種,返回類型只能是他們的共同父類 Object 。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM