从ListModel转换为Java 7中的DefaultListModel

时间:2011-10-20 05:03:52

标签: java

如何将ListModel强制转换为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();

我有一种感觉,这是一个愚蠢的问题,但我完全被这个新的通用事物所困扰!请帮帮我!

1 个答案:

答案 0 :(得分:5)

Java的Collections工作方式是您可以使用Collection类型对象来存储一大堆Objects。在引入Generics之前,您可以将任何对象存储在Collection中,然后当您想要从集合中获取这些对象时,您必须执行强制转换。

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,Generics在插入列表时提供编译时类型检查。现在,如果您将myList声明为List<String>,当您尝试将类型为MyValueClass的对象添加到List时,上面的第一个代码块将在编译时失败。

在Java 1.7中,DefaultListModel是通用的。因此,当您调用portalList.getModel()时,您将返回包含特定类型对象的DefaultListModel<E>就是这样;它是实际对象类型的占位符。)在上面的List<String>示例中,String代替E

因此,如果您的portalList对象的model成员是DefaultListModel,其中包含一堆MyValueClass个对象,那么您的声明应如下所示:

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

请参阅DefaultListModel API doc