2

我正在为用户界面编写一些代码。在这段代码中有一个通用接口,如下所示:

public interface DataValue<T>
{
  public String getName();

  public T getValue();

  public String getDescription();

}

现在,此接口由代码中的许多枚举实现,并在悬停事件控制器中用于接口中可由 DataValue 接口表示的值。我意识到这个控制器中有一些警告,所以我没有成功地试图找到一种方法来删除它们。控制器类如下所示:

public class HintController implements ItemHoverHandler
{

private final Class<? extends Enum> theEnumClass;

public HintController(Class<? extends Enum> enumClass)
{
    theEnumClass = enumClass;
}

@Override
@SuppressWarnings("unchecked")
public void onItemHover(ItemHoverEvent event)
{
  FormItem formItem = event.getItem();
  Enum<?> enumValue =
     Enum.valueOf(theEnumClass, (String)formItem.getValue());
  String prompt = (enumValue instanceof DataValue)
     ? getPromptForDataValue((DataValue)enumValue)
     : null;
  formItem.setPrompt(prompt);
}


 private String getPromptForDataValue(DataValue<?> dataValue)
 {
  return "<b>" + dataValue.getName() + "</b><br /><br />"
     + dataValue.getDescription();
 }
}

当然,这个实现有一些我无法修复的 rawType 警告。如果我用 ? 通配符它将显示边界异常。我的关闭“尝试”是当我尝试更改字段的类型和构造参数 tom 时,如下所示:

 public class HintController implements ItemHoverHandler
 {

   private final Enum<? extends DataValue<?>> theEnumClass;

   public HintController(Enum<? extends DataValue<?>>enumClass)
   {
    theEnumClass = enumClass;
   }


    @Override
    public void onItemHover(ItemHoverEvent event)
    {
     FormItem formItem = event.getItem();
     Enum<? extends DataValue<?>>enumValue =
        Enum.valueOf(theEnumClass.getDeclaringClass(),formItem.getValue().toString());
     String prompt = (enumValue instanceof DataValue)
        ? getPromptForDataValue((DataValue<?>)enumValue)
       : null;
     formItem.setPrompt(prompt);
    }


    private String getPromptForDataValue(DataValue<?> dataValue)
    {
      return "<b>" + dataValue.getName() + "</b><br /><br />"
        + dataValue.getDescription();
    }
 }

但当然,它失败了,因为我找不到实际发送该类型引用的方法,因为它们是枚举,我无法实例化它们。我认为应该有适当的方法来做到这一点,如果有人可以提供帮助,将不胜感激。谢谢

4

3 回答 3

1

乍一看,您的问题似乎可以通过HintController通用来解决:

public class HintController<T extends Enum<T>> implements ItemHoverHandler {

    private final T theEnumClass;

    //and so on...

但是请注意,这theEnumClass可能是错误的名称,因为它只是指向 enum 的一个实例T。您可能想Class<T>改用。这将允许您调用方法反射方法,例如getEnumConstants().

于 2013-01-15T20:13:56.593 回答
1

您可以通过在 上放置一个真实的类型参数来消除警告HintController

public class HintController<E extends Enum<E>> implements ItemHoverHandler {

    private final Class<E> theEnumClass;

    public HintController(Class<E> enumClass) {
        theEnumClass = enumClass;
    }

    @Override
    public void onItemHover(ItemHoverEvent event) {
        FormItem formItem = event.getItem();
        E enumValue = Enum.valueOf(theEnumClass, (String) formItem.getValue());
        String prompt = (enumValue instanceof DataValue) ? getPromptForDataValue((DataValue<?>) enumValue) : null;
        formItem.setPrompt(prompt);
    }

    private String getPromptForDataValue(DataValue<?> dataValue) {
        return "<b>" + dataValue.getName() + "</b><br /><br />" + dataValue.getDescription();
    }

}

考虑到对使用它的其他类的影响,这是否合理,我不能说。我想它会是 - 任何创建一个已经对enumClass构造函数参数的类型有所了解的地方,它可以简单地传播到HintController. 以其他方式使用它的地方总是可以称它为HintController<?>.

于 2013-01-15T20:15:22.803 回答
0

我不确定这应该是一个界面。看起来 DataValue 实际上应该是一个class

public class DataValue< T extends Enum >
{
    public String getName() { ... }
    public String getValue() { ... } 
    public String getDescription() { ... }
}

如果你这样做,那么只需将 DataValue 放在悬停事件中 - 然后直接从中获取信息。

于 2013-01-15T20:13:44.363 回答