2015-06-21 58 views
1

試圖完全理解Java中的泛型,我遇到了一個我無法解決的問題,也沒有在網絡中找到具體的解決方案。 我有這樣的方法:Java中的數組,列表和泛型

public <T extends City> void someMethod(List<T[]> objectsList) { 
    List<City[]> myList = (List<City[]>) objectsList; 
} 

只是寫這與我提供了一個錯誤,我可以忽略編譯器 - 但是在編譯過程中編譯器無法說

Error:(97, 46) error: incompatible types: List<T[]> cannot be converted to List<City[]> where T is a type-variable: T extends City declared in method <T>someMethod(List<T[]>) 

一個簡單的解決方案是簡單的運行在收到的'objectsList'中的整個列表和數組,並且一次對它們進行類型轉換,這將工作(我嘗試過),但是我不確定這是否是正確的方式來執行它...

+0

可以張貼一些更code..post一個[MCVE](http://stackoverflow.com/help/mcve)(最小完備可驗證實施例)或[SSCCE](HTTP://www.sscce .org /)(簡短,獨立,正確的例子)。 – Madhan

+0

*一個簡單的解決方案是簡單地運行接收到的'objectsList'中的整個List和Arrays,並一次一個地對它們進行類型轉換,這可以工作*。我抓着我的腦袋,想知道你到底是什麼意思?如果你首先告訴我們在'someMethod'內部想要做什麼,你不覺得這會更有意義嗎? – CKing

+5

@Madhan:那**是**一個MCVE。 – Makoto

回答

2

這不是你要想做的事經常(因爲仿製藥和陣列不拌勻)的東西,但也有記下一些重要的事情:

  • T保存該方法的類型信息。 Java可能不會在任何時候傳遞City,而在沒有傳遞的情況下,Java不能幫助您。
  • 由於泛型是不變的,因此演員陣容並不安全;你不能說List<City[]>相當於List<T[]>,即使T extends City

因此,你可以做些什麼來解決這個問題是使用泛型綁定的通配符。在您接受該方法的聲明以及您正在存儲的內容中使用它們。然後您避免演員陣容,並且所有內容都是類型安全的。

public <T extends City> void someMethod(List<? extends T[]> objectsList) { 
    List<? extends T[]> myList = objectsList; 
} 
0

There沒必要投 - 只是工作無線th陣列的類型T[]。例如,該編譯:

public <T extends City> void someMethod(List<T[]> objectsList) { 
    for (T[] cities : objectsList) { 
     for (City city : cities) { 
      // do something with the city object 
     } 
    } 
} 

該方法中的代碼不知道其中City確切的子類的數組,但你可以將它們分配給City類型的變量,並把它們作爲City對象。


的原因,你投不工作是由於這樣的事實:List<SubType>不是List<Type>一個亞型。

0

因爲在Java中,數組就像一個類型。 Ergo,類型City[]T extends City完全不同看起來非常狡猾,我不確定你在找什麼。

如何使用泛型

比方說,你要以相反的順序返回ArrayList一個parametrised。我不知道爲什麼,我希望有一個完美的庫函數可以這麼做,但讓我們一起滾動。

public ArrayList<E> getReversedList(ArrayList<E> list) { 
    ArrayList<E> newList = new ArrayList(list.size()); 

    for (int i = 0; i < list.size(); i++) 
     newList.add(list.size() - i, (E) list.get(i)); 

    return newList; 
}