2010-11-24 76 views
1

所以我們可以說我要繪製List<?>的類層次結構。將List<Object>List<?>子類層次

亞型然後將List<Integer>List<Object>亞型或者這將是一個List<?>亞型?

感謝

+2

什麼?列表不能是它自己的子類型。 – AlexR 2010-11-24 08:57:13

+0

一旦你獲得2000+的代表,你已經贏得了能夠看到帖子來源的優勢;) – aioobe 2010-11-24 09:11:40

回答

2

然後將List<Integer>List<Object>一個亞型?

不,Java中的泛型類是not covariant

從上面的鏈接:

原來有一個很好的原因,它不工作的方式:它會破壞類型安全泛型是應該提供的。想象一下,您可以將List<Integer>分配給List<Number>。然後將下面的代碼將讓你把東西,是不是一個IntegerList<Integer>

List<Integer> li = new ArrayList<Integer>(); 
List<Number> ln = li; // illegal 
ln.add(new Float(3.1415)); 

List<?>略有不同,如果我理解正確,它類似於原始類型在此意義上這裏的類型參數是未知的。這裏例如,第二行編譯罰款,但現在的第三行是非法的,因爲編譯器可以肯定地說,這是一個法律add操作:

List<Integer> li = new ArrayList<Integer>(); 
List<?> ln = li; 
ln.add(new Float(3.1415)); // illegal 

因此,通過假設「是分配給」定義亞型,我想List<Object>List<?>的子類型。

0

唯一一個類或接口是它自己的孩子的地方是評估泛型邊界。

一些示例方法簽名:

public <E extends<Enum<E>> void doSomeThingWithAnEnum(E item); 

public <S extends Comparable<? super S>> void sort(S[] items); 

但是,這是不是一個真正的類型層次結構,所有這些信息都是由編譯器中刪除。得到的字節碼大致相當於:

public void doSomeThingWithAnEnum(Enum item); 

public void sort(Comparable[] items);