2016-07-20 32 views
1

我有一行代碼在下面。ArrayList是一種原始類型。引用泛型ArrayList <E>應參數化修復引起的錯誤

List<? extends SortKey> sortKeys = new ArrayList(); 

這引起了警告ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized。我做了一些研究,發現這些問題 - Collections of generics 「Cannot instantiate the type ArrayList」How can elements be added to a wildcard generic collection?。所以我構建了一個public List,看起來像下面這樣。

public <T extends SortKey> List<T> sortKeys() { 
    List<SortKey> keys = new ArrayList<SortKey>(); 
    keys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING)); 
    keys.add(new RowSorter.SortKey(1, SortOrder.ASCENDING)); 
    return keys; 
} 

但是,當我嘗試編譯此代碼時,出現錯誤Type mismatch: cannot convert from List<RowSorter.SortKey> to List<T>。我該如何解決這個錯誤?



我還發現了該代碼,List<? extends SortKey> sortKeys = new ArrayList<>();行,消除了警告,但我不明白爲什麼?如果有人花時間來解釋或引用一些能讓我理解的東西,我將不勝感激。


編輯
使用下面的代碼修正錯誤。

public <T extends SortKey> List<T> sortKeys() { 
    List<T> keys = new ArrayList<T>(); 
    keys.add((T) new RowSorter.SortKey(0, SortOrder.ASCENDING)); 
    keys.add((T) new RowSorter.SortKey(1, SortOrder.ASCENDING)); 
    return keys; 
} 

但是,產生新的警告,其狀態爲Type safety: Unchecked cast from RowSorter.SortKey to T

+0

'T擴展SortKey'告訴編譯器類型必須從'SortKey'(是一個子類型)派生,而不是實際上是'SortKey'。由於你的函數返回'List ',所以你不能返回'List '。既然你正在返回'keys'(這是一個'List '),你會收到一個錯誤。 –

+0

至於'List <?擴展SortKey> sortKeys = new ArrayList()'給出錯誤,這是因爲你從不指定類型參數,這使得它是原始的(與ArrayList 相同)。由於變量指定了類型參數,因此該值必須是(或至少可以推斷出它)。做新的ArrayList <>()'允許推斷來指定類型 –

+0

爲什麼你的方法是通用的?你爲什麼不返回一個'List ''? –

回答

1

對於第一個問題,您錯過了new ArrayList() - >new ArrayList<>()上的通用大括號。

對於第二個問題,您嘗試使用SortKey(當然,它不從SortKey擴展)作爲列表類型。

不知道你爲什麼要這樣存儲它們,但是,因爲你可以按超類的類型存儲子類。

+3

「通用大括號」正確的術語是[鑽石運算符](http://stackoverflow.com/questions/4166966/what-is-the-point-of-the-diamond-operator-in-java-7 )。 – bcsb1001

+0

鑽石運算符在JDK 7中實現,表示爲編譯器引用類型而留出泛型的大括號爲空的功能。在這種情況下,我可以取而代之,但並不認爲這是提及大括號整體的正確術語。 –

+1

@ bcsb1001根據[JLS](https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.1),正確的術語實際上是「*尖括號*」 0.2)。 AFAIK,規範從來沒有把他們稱爲鑽石商。 –

相關問題