2013-01-08 68 views
2

可能重複:
How do you cast a List of objects from one type to another in Java?如何從列表<Object>轉換成列表<A>或列表<? extends A>?

在網上搜索了一下,發現這樣做的沒有很好的方式...我的解決方案現在是:

public class A {} 
List<Object> obj = new ArrayList<Object>(); 
obj.add(new A()); 
// Ugly solution here: 
List<A> a = (List<A>) (List) obj; 

但這是相當醜陋的,並得到警告。沒有「官方」的做法?

編輯:誰收這個傢伙:我知道張貼在How do you cast a List of objects from one type to another in Java?的解決方案是一樣的一個我張貼在我的問題(只需添加<?>第一投不完全相同後)我是尋找更「乾淨」的東西。在使用Class<?> clazz = listobj.get(0).getClass方法獲取類並在運行時轉換爲正確的類的方法(但不知道是否有類似的工作... Eclipse似乎並不喜歡它...)

+3

你爲什麼要創建在首位'名單' ? –

+0

@AdamArold謝謝你的回答。是的,我應該更具體一些:'List '來自於我使用JDBC讀取數據庫的事實,並且我不一定知道將會出現的數據類型。很明顯,我並沒有創造'名單'爲樂趣^^ –

回答

8
List<Object> obj = new ArrayList<Object>(); 
obj.add(new A()); 

它不是寫代碼的正確途徑。基本上你正在創建一個通用的列表並添加對象到它,它鍵入不安全並保留任何對象類型。

List<Object> obj = new ArrayList<Object>(); 
obj.add(new A()); 
obj.add(new String("str")); 
obj.add(1); 

建議創建類型安全的ListList<A> obj = new ArrayList<A>();

你可以以這樣的方式做到這一點 -

public <T>List<T> castCollection(List srcList, Class<T> clas){ 
    List<T> list =new ArrayList<T>(); 
    for (Object obj : srcList) { 
    if(obj!=null && clas.isAssignableFrom(obj.getClass())) 
     list.add(clas.cast(obj)); 
    } 
    return list; 
} 
+0

謝謝你的回答。是的,我應該更具體一些:'List '來自於我使用JDBC讀取數據庫的事實,並且我不一定知道將會出現的數據類型。很明顯,我不是創造'名單'爲樂趣^^ –

+0

回答更新。 –

+0

謝謝你的回答。是的,這似乎是一個解決方案,將沿着我喜歡的方向前進。我會檢查出來的。由於這是我得到的最佳答案,我將對其進行驗證。謝謝! –

6

所以你爲什麼不把你的清單聲明爲

List<A> obj = new ArrayList<A>(); 

要開始嗎?

做你想做的事實在很危險。你所說的是你的清單包含A和它的子類。但由於它最初是一個Object s(即任何東西)的清單。以後你可能會遇到一個令人討厭的驚喜。

那個編譯器的錯誤真正意味着什麼地方,你有一個設計問題。

+2

Downvoted * why *? –

+3

+1這是做這件事的好方法,即使它不是OP要找的東西。 –

+0

@BrianAgnew謝謝你的回答。是的,也許我有一個設計缺陷,但是當我使用Apache的[commons-dbutils-1.5.jar](http://commons.apache。org/dbutils /)for JDBC,我設計它可以從數據庫中獲取任何數據類型。因此'列表'。但爲了以後的使用,我需要將它們轉換爲它們的java類型......我在這裏使用JDBC完全錯誤嗎? (我沒有經驗,只是開始編碼:)) –

2

也許問題是你想把不同的(但與繼承有關的)類型的對象放入列表中?在這種情況下,你讀了Generics Tutorial,尤其是關於<? extends Something><? super Something>

乾杯部分,

相關問題