2010-10-13 48 views
1
package pkg_2; 

import java.util.*; 

class shape{} 

class Rect extends shape{} 

class circle extends shape{} 

class ShadeRect extends Rect{} 

public class OnTheRun { 

    public static void main(String[] args) throws Throwable { 
     ShadeRect sr = new ShadeRect(); 
     List<? extends shape> list = new LinkedList<ShadeRect>();  
     list.add(0,sr); 
    } 

} 
+0

那麼,你在這裏問什麼? – zigdon 2010-10-13 05:48:41

+1

小寫的類名稱不完全正確。 – Thilo 2010-10-13 05:50:03

+0

編譯器抱怨最後一行並告訴我錯誤我不能理解它 – MineIsMine 2010-10-13 05:51:02

回答

6

你不能爲List<? extends X>.

add添加任何東西不能被允許的,因爲你不知道的組件類型。考慮以下情況:

List<? extends Number> a = new LinkedList<Integer>(); 
a.add(1); // in this case it would be okay 
a = new LinkedList<Double>(); 
a.add(1); // in this case it would not be okay 

對於List<? extends X>你只能出去的對象,但不能添加。 相反,對於List<? super X>,您只能添加對象,但不能將它們取出(您可以獲取它們,但只能作爲Object,而不能作爲X)。

此限制修復了陣列以下問題(你在哪裏讓這些「不安全」受讓人):

Number[] a = new Integer[1]; 
a[0] = 1; // okay 
a = new Double[1]; 
a[0] = 1; // runtime error 

至於你的程序,你可能只想說List<shape>。您可以將所有形狀的子類放入該列表中。

ShadeRect sr = new ShadeRect(); 
List<shape> list = new LinkedList<shape>();  
list.add(0,sr); 
+0

謝謝,優秀的答案..... – MineIsMine 2010-10-13 06:08:49

+0

+1 - 尼斯的解釋。 – 2010-10-13 06:19:24

相關問題