2011-12-28 109 views
0

我想創建一個只接受特定類的容器。使用泛型如下:Java泛型:通配符

static class Test1<C extends Test1> { 
      C field = null; 
      public C getField() { 
       return field; 
      } 
      public void setField(C field) { 
       this.field = field; 
      } 
     } 
     static class Test2 extends Test1{ 
     } 

class MainTest { 
      public static void main(String[] args) throws Exception { 
       List<Test1<? extends Test1>> list = new ArrayList<Test1<? extends Test1>>(); 
       Test1<Test2> newInstance = new Test1<Test2>(); 
       list.add(newInstance); 
       Test1<Test2> value = list.get(1); 
    } 
} 

只是想了解爲什麼這個名單>願意接受的newInstance對象,但編譯時錯誤,而我取「的Test1值」後發生? 是否有任何解決該問題的機會?

在此先感謝。

UPDATE 許多人注意到「Test1<? extends Test1>,其中?可能不等於Test2」。 我完全同意,但據我所知,在這種情況下,我需要鍵入提取的值到Test1<Test2>,這意味着在這種情況下泛型的全部內容都會丟失......如果我錯了,請糾正我。

+0

你爲什麼不宣佈名單的'名單> list'? – BalusC 2011-12-28 15:38:47

+0

'Test1 '是'Test1 <?擴展Test1 >',但Test1 <?擴展Test1 >'不是'Test1 '的一個實例。 (你也有罕見的類型 - 混合的通用類型和原始類型 - 這是個壞消息。) – 2011-12-28 15:41:14

+0

我希望列表包含Test1的所有組合,其中包含它的任何後代。 – user1119571 2011-12-28 15:41:47

回答

1

因爲當你list.get(1)返回Test1<? extends Test1>,其中?可能不等於Test2

一方面list.add(...)接受Test1<? extends Test1>,即Test1帶有任何泛型參數,它是Test1的繼承者。

+0

那麼你是說類型轉換是解決問題的唯一方法?但是在這種情況下,使用泛型的全部觀點都會丟失...... – user1119571 2011-12-28 15:43:37

+0

這不是泛型的一點。 – BalusC 2011-12-28 17:13:03

+0

泛型的要點是確保設計時的類型安全,如果我錯了,請糾正我的錯誤。如果是這樣,那麼類型轉換基本上就是毀了整個想法。很高興聽到你的考慮。 – user1119571 2011-12-28 18:49:59

0

這是因爲您可以將Test1的子項的每個對象作爲輸入參數來存儲Test1 <>。比方說,你有 類Test3的擴展測試1 那麼你就必須

Test1<Test2> value = list.get(1); 

但名單將如何確保與指數1元素有一個通用型的Test2但不Test3的,因爲它接受的Test1的每一個亞型( )。

獲取元素的正確方法是使用

Test1<? extends Test1> test1 = list.get(1); 
0

您可以通過編寫

Test1<? extends Test1> value = list.get(1); 

代替

Test1<Test2> value = list.get(1); 

或者通過強制轉換爲Test1的解決問題。

+0

而之後,我應該typecaset Test1 ? – user1119571 2011-12-28 15:47:04

0
List<Test1<? extends Test1>> list = new ArrayList<Test1<? extends Test1>>(); 

這是一個只讀列表,你只能插入空這份名單,沒有別的

下面改用:

List<Test1<? extends Test1>> list = new ArrayList<Test1<XXX>>(); where XXX extends Test1