[英]Wildcards and Subtyping on Java
我剛剛開始研究Java上的通配符和子類型,並嘗試測試我所學到的東西。
假設:
Class A { public int y=1; }
Class B extends A { public int x=2; }
在主要方面:
List<B> lb = new ArrayList<>();
lb.add(new B());
System.out.println(lb.get(0).y); //Displays member y of Class A
List<? extends A> la = lb;
System.out.println(la.get(0).y); //Can access member y of Class A
List<A> la1 = new ArrayList<>();
la1.add(new A());
System.out.println(la1.get(0).y); //Displays member y of Class A
List<? super B> lb1 = la1;
System.out.println(lb1.get(0).y); //Cannot access member y of Class A? Why?
我不明白為什么我無法使用“下界通配符”來訪問成員y,而有可能使用“上界通配符”。 我想念什么嗎?
考慮
Interface X { ... }
Class A { public int y=1; }
Class B extends A implements X { public int x=2; }
List<? super B> lb1 = la1;
現在,只要lb1
的對象實現了X
,它們就可能與A
和B
完全無關。 編譯器無法知道lb1.get(0)
具有成員y
。
一個更“具體”的例子:
Class X { ... }
Class A extends X { public int y=1; }
Class B extends A { public int x=2; }
使用此層次結構, lb1
對象可以是類型X
,沒有成員y
。
U
上限:必須至少為U
什么U
有,你可以使用。
L
下限:最多可以為L
(同時保持其層次結構),但是不能保證一定會。
簡單來說,您無法從使用關鍵字“ SUPER”構造的列表中獲得“ TYPE”。
的System.out.println(lb1.get(0).Y); //這是您期望的A / B類型的錯誤
我猜,以下應該起作用
的System.out.println(((A)(lb1.get(0)))Y);
由於您只能從此列表中刪除一個對象,因此需要將其強制轉換為“ TYPE”
只需更新行
((A)lb1.get(0)).y
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.