如何将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();
我有一种感觉,这是一个愚蠢的问题,但我完全被这个新的通用事物所困扰!请帮帮我!
答案 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();