Java 泛型方法是否需要具有泛型类型参数才能正常工作?

Java 泛型方法是否需要具有泛型类型参数才能正常工作?,java,generics,zk,Java,Generics,Zk,我只是浏览了一些试图泛化代码以使其现代化的类,我注意到有一个库方法在我的类中使用得非常普遍,它似乎从根本上是错误的,但我觉得我没有足够的知识来解释它是否真的错了 我们使用Java Web UI框架(称为ZK)中的ListModel从数据库表中检索数据,然后显示在列表框中,我注意到有很多代码可以执行以下操作: ListModelList lm = (ListModelList) lbox.getListModel(); lm.add(item); “getListModel()”的库方法声明为:

我只是浏览了一些试图泛化代码以使其现代化的类,我注意到有一个库方法在我的类中使用得非常普遍,它似乎从根本上是错误的,但我觉得我没有足够的知识来解释它是否真的错了

我们使用Java Web UI框架(称为ZK)中的ListModel从数据库表中检索数据,然后显示在列表框中,我注意到有很多代码可以执行以下操作:

ListModelList lm = (ListModelList) lbox.getListModel();
lm.add(item);
“getListModel()”的库方法声明为:

public ListModel getListModel()
可以在这里找到:

现在,当我提出这样做:

ListModelList<Material> lm = new ListModelList<Material>(itemList);
lbox.setModel(lm);

ListModelList model = (ListModelList) lbox.getListModel(); // returned type is ListModel<Object> and generates a compiler warning
ListModelList lm=新的ListModelList(itemList);
lbox.setModel(lm);
ListModelList模型=(ListModelList)lbox.getListModel();//返回的类型为ListModel并生成编译器警告
由于类型擦除而从ListModel强制转换生成编译器警告

但如果我这样做:

ListModelList<Material> lm = new ListModelList<Material>(itemList);
lbox.setModel(lm);

ListModelList<Material> model = lbox.getListModel(); // compiler error.
ListModelList lm=新的ListModelList(itemList);
lbox.setModel(lm);
ListModelList model=lbox.getListModel();//编译器错误。
我认为这是一个API缺陷,需要每个人对正确的泛型类型(如果你知道的话)进行不安全的强制转换才能使用泛型,这是错误的吗?还是有更好的方法来防止每次似乎不必要的强制转换?

getListModel()
返回一个
ListModel
,而不是
ListModelList
。 因此,您可以用
ListModel
替换
ListModel列表
,或者如果您需要
ListModel列表
的方法并确保这是返回的对象类型,则必须执行显式强制转换

ListModel<Material> model = lbox.getListModel(); 
ListModel=lbox.getListModel();

ListModelList模型=(ListModelList)lbox.getListModel();
getListModel()
返回一个
ListModel
,而不是
ListModelList
。 因此,您可以用
ListModel
替换
ListModel列表
,或者如果您需要
ListModel列表
的方法并确保这是返回的对象类型,则必须执行显式强制转换

ListModel<Material> model = lbox.getListModel(); 
ListModel=lbox.getListModel();

ListModelList模型=(ListModelList)lbox.getListModel();

您能否从
ListModelList model=lbox.getListModel()发布编译器错误消息?可能问题在于getListModel()返回一个ListModel,而不是ListModelList?@PaulBellora错误是:类型不匹配:无法从ListModel转换为ListModelList@user2302436ListModelList是接口类型ListModel的已知实现者,因此类型不应该有任何问题,也不需要强制转换才能正常工作。Source:@DanielBond是的,但它是向下投射而不是向上投射,必须显式执行,因为接口是ListModel,ListModelList是实现它的各种类之一。例如,实际的ListModel可以是ListModelSet,也可以是实现ListModel的另一个不同类。您是否可以从
ListModelList model=lbox.getListModel()发布编译器错误消息?可能问题在于getListModel()返回一个ListModel,而不是ListModelList?@PaulBellora错误是:类型不匹配:无法从ListModel转换为ListModelList@user2302436ListModelList是接口类型ListModel的已知实现者,因此类型不应该有任何问题,也不需要强制转换才能正常工作。Source:@DanielBond是的,但它是向下投射而不是向上投射,必须显式执行,因为接口是ListModel,ListModelList是实现它的各种类之一。例如,实际的ListModel可能是一个ListModelSet,或者实现ListModel的另一个不同类。不幸的是,ListModel没有提供所需的方法,因为它没有提供任何类型的“add(…)”方法,并将该行为留给实现者。我想我现在还在演演员。感谢帮助。不幸的是,ListModel没有提供所需的方法,因为它没有提供任何类型的“add(…)”方法,并将该行为留给其实现者。我想我现在还在演演员。谢谢你的帮助。
ListModelList<Material> model = (ListModelList<Material>)lbox.getListModel();