簡體   English   中英

Java上的通配符和子類型

[英]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 ,它們就可能與AB完全無關。 編譯器無法知道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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM