Java组合和泛型类型

时间:2015-07-05 22:09:38

标签: java generics

我尝试创建类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();

...

3 个答案:

答案 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的元素