2017-08-26 95 views
-6

泛型的整個想法是類型安全和防止演員。獲取從<? super A>

當我添加()到<? super A>的列表時,它讓我編譯get的唯一方法是將變量類型聲明爲Object。

ArrayList<? super A> list = new ArrayList<A>(); 

    Object obj = list.get(0); 

事實是,我只能將A和A的子類添加到此列表中。

所以一個,爲什麼它不讓我聲明OBJ爲A型?

A obj = list.get(0);

和兩個,事實上,類型現在是Object,似乎放鬆了整個仿製藥的想法 - 我正在含有它的傘型,我需要轉換.get()

+0

什麼是'genB'列表? – user2357112

+0

'genB'應該是一個類型嗎?爲什麼它是小寫字母?你爲什麼選擇某種類型的東西似乎與任何事情沒有關係? – user2357112

+0

@ user2357112對於輸入錯誤感到抱歉。固定。 – jforex78

回答

1

如果您有類型List<? super A>的變量,則只能通過該變量將A類型的值添加到。這並不意味着它不能在它的其他對象:

List<Object> l = new ArrayList<>(); 
l.add(new Object()); 
List<? super A> l2 = l; 

l2.add只能用A類型的值調用,但l2.get可以返回非A實例。

2

您將該列表定義爲列表<? super A>,這意味着該列表包含的元素爲A或其任何超類,這會導致問題,因爲可以有任意數量的超類,它們可以一路最多爲object,所以編譯器可以保證的是,從列表返回的項目是一個對象。

如果你想有一個包含A是你應該把它定義爲一個List<A>其guarentees名單將只包含A S或A的子類

+0

嗨,實際上,我無法將A的超類添加到此列表中。例如,我不能添加一個新的Object()。它給我一個捕獲#1錯誤。我只能將A及其子類添加到此列表中。所以,我應該能夠將變量類型從dec獲取爲A,因爲它只能是A類型。 – jforex78

+0

更深入的解釋可以在這裏獲得: https://stackoverflow.com/a/4343547/8041461 – jrtapsell

+0

嗯。看來只使用我可以.add()到'list'的東西是A的子類,但是'list'本身可以指向A的超類。如果不奇怪,它是一個有趣的發現。 – jforex78