是否需要通用方法才能使通用类型参数正常工作?

时间:2013-05-01 13:34:57

标签: java generics zk

我正在尝试对代码进行一些化处理,以便对代码进行现代化处理,并且我注意到有一种库方法在我的课程中很常用,这似乎是根本错误的,但我不知道我觉得我有足够的知识来解释它是否真的错了。

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

ListModelList lm = (ListModelList) lbox.getListModel();
lm.add(item);

“getListModel()”的库方法声明是:

public <T> ListModel<T> getListModel()

,可在此处找到:http://www.zkoss.org/javadoc/latest/zk/org/zkoss/zul/Listbox.html#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

由于类型擦除而导致由于ListModel的强制转换而生成编译器警告。

但如果我这样做:

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

ListModelList<Material> model = lbox.getListModel(); // compiler error.

我认为这是一个API漏洞,并且要求每个人都使用泛型来对正确的泛型类型(如果你知道的话)进行不安全的转换,这是不正确的吗?或者,是否有更好的方法可以防止每次看似不必要的演员?

1 个答案:

答案 0 :(得分:4)

getListModel()会返回ListModel<T>而不是ListModelList<T>。 因此,您可以将ListModelList<Material>替换为ListModel<Material>,或者如果您需要ListModelList的方法,并且确定这是返回的对象的类型,则必须进行显式转换。

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

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