2011-10-20 33 views
1

如何將ListModel投射到DefaultListModel ??!我執行以下,我收到此錯誤信息,從ListModel投射到Java 7中的DefaultListModel

DefaultListModel portalListModel = (DefaultListModel) portalList.getModel(); 

C:\Documents and Settings\...\myfile.java:728: warning: [rawtypes] found raw type: DefaultListModel 
    DefaultListModel portalListModel = (DefaultListModel) portalList.getModel(); 
missing type arguments for generic class DefaultListModel<E> 
where E is a type-variable: 
E extends Object declared in class DefaultListModel 

我嘗試以下,

DefaultListModel<E> portalListModel = (DefaultListModel) portalList.getModel(); 

我有一種感覺,塔,這是一個愚蠢的問題,但我完全同意這個新的通用confued事情!請幫助我!

+0

什麼類型的數據(哪個類)在您的列表模型中? –

+0

如果你不知道確切的類型參數,你可以使用'?'。嘗試'DefaultListModel portalListModel =(DefaultListModel)portalList.getModel();' – Stephan

回答

5

Java集合的工作方式是您可以使用集合類型對象來存儲一大堆對象。在引入泛型之前,您可以將任何對象存儲在集合中,然後當您想要將這些對象從集合中取出時,您必須執行一次投射。

List myList = new ArrayList(); 
myList.add("string"); 
myList.add(new MyValueClass(42, "identifying string")); 

這是完全可以接受的代碼。如果你想遍歷的對象,你可以做到這一點,像這樣:

Iterator it = myList.iterator(); 
while (it.hasNext()) { 
    String str = (String) it.next(); // NOTE: This will work the first time, but throw a ClassCastException when it gets to the second item. 
} 

使用Java 1.5,泛型提供編譯時類型檢查,在插入列表中。因此,現在,如果您將myList聲明爲List<String>,那麼當您嘗試向列表中添加MyValueClass類型的對象時,上面的第一個代碼塊將在編譯時失敗。

在Java 1.7中,DefaultListModel是通用化的。因此,當您撥打portalList.getModel()時,您將收回包含某種類型對象的DefaultListModel(這是<E>是的;它是實際對象類型的佔位符。)在上面的List<String>示例中,String是替換爲E

因此,如果您portalList對象的model成員是DefaultListModel包含了一堆MyValueClass的對象,那麼你的聲明應該是這樣的:

DefaultListModel<MyValueClass> portalListModel = portalList.getModel(); 

DefaultListModel API doc

+0

有人可以請解釋//注意:在他的答案? –

+1

當然。所以在我的例子中(第一個代碼塊),我們有一個名爲myList的基本(預Java-1.5樣式)'List'對象,它包含兩個對象。 myList中的第一個對象是類String。 myList中的第二個對象是類MyValueClass。因此,當迭代'myList'中的值以將其拉出時,迭代器中的代碼特別期待'String'對象。第一次通過循環,它會正常工作。然而,第二次,它會抓住'MyValueClass'對象,嘗試將其轉換爲'String',並拋出一個'ClassCastException'。 – Mike