我尝试创建类org.eclipse.swt.custom.CCombo的组合 (对于'项目'原因,我无法从CCombo继承。)
当我想要检索所选数据元素时,目标是在任何地方避免使用此代码:
MyElement selectedElement = (MyElement) myCombo.getData(Integer.toString(selectedIndex));
组合填充如下:
combo.setData(Integer.toString(myIndex), myObject);
所以到目前为止是这样做的:
public class GenericCCombo {
private CCombo combo;
public GenericCCombo(CCombo c) {
combo = c;
}
public IGenericComboList getSelectedData () {
return (IGenericComboList) combo.getData(String.valueOf(combo.getSelectionIndex()));
}
IGenericComboList是juste:
public interface IGenericComboList {
public String getDescription();
}
所以在我的实现代码中,我可以像这样检索我选择的数据:
//MyElement is just an enum that implements IGenericComboList.
MyElement selectedElement = (MyElement)dateCombo.getSelectedData();
我的问题是:我可以使用'泛型类型'为了避免在这里施放:
(MyElement)dateCombo.getSelectedData();
...
答案 0 :(得分:0)
您可以使用泛型类型参数声明GenericCCombo
:
class GenericCCombo<T> {
public T getSelectedCombo() {
//...
}
}
创建GenericCCombo
对象时,请指定MyElement
(或您想要的任何元素):
GenericCCombo<MyElement> dateCombo = ...;
如果您不确定可能返回哪个值,请将泛型作为错误选项,请查看visitor pattern。您不需要知道所使用对象的类型,而是将信息传递给对象并允许对象本身处理它。
答案 1 :(得分:0)
是的,你可以在这里使用泛型,而这样做的方法是在GenericCCombo
上使用泛型参数。我建议你将传入元素的.class
作为一个附加参数,并将其用作仔细检查你是否拥有合适的类:
public class GenericCCombo<E extends IGenericComboList> {
private CCombo combo;
private Class<E> clazz;
public GenericCCombo(CCombo c, Class<E> clz) {
combo = c;
clazz = clz;
}
public E getSelectedData () {
Object o = combo.getData(String.valueOf(combo.getSelectionIndex()));
if (! clazz.isInstance(o)) {
throw new ClassCastException(String.format(
"Element '%s' is instance of %s. Expected: %s",
o, o.getClass(), clazz));
}
return clazz.cast(o);
}
}
答案 2 :(得分:-1)
是的,它可能。使用Generic类型定义接口IGenericComboList。
interface IGenericComboList<E> {
public String getDescription();
}
确保&#34; dateCombo.getSelectedData();&#34;返回IGenericComboList的元素