Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有枚举和接口的Java反射_Java_Events_Gwt_Reflection_Enums - Fatal编程技术网

带有枚举和接口的Java反射

带有枚举和接口的Java反射,java,events,gwt,reflection,enums,Java,Events,Gwt,Reflection,Enums,我正在为用户界面编写一些代码。在此代码中有一个通用接口,如下所示: public interface DataValue<T> { public String getName(); public T getValue(); public String getDescription(); } public class HintController implements ItemHoverHandler { private final Class<? exte

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

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

  public T getValue();

  public String getDescription();

}
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();
 }
}
公共接口数据值
{
公共字符串getName();
公共T getValue();
公共字符串getDescription();
}
现在,这个接口是通过代码中的许多枚举实现的,它在悬停事件控制器中用于接口中可以由DataValue接口表示的值。我意识到这个控制器中有一些警告,所以我试图找到一种方法来删除它们,但没有成功。控制器类如下所示:

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

  public T getValue();

  public String getDescription();

}
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();
 }
}
公共类HintController实现ItemHoverHandler
{
私有最终类枚举值=
Enum.valueOf(thenumclass,(String)formItem.getValue());
字符串提示=(enumValue instanceof DataValue)
?getPromptForDataValue((DataValue)枚举值)
:null;
formItem.setPrompt(prompt);
}
私有字符串getPromptForDataValue(DataValue DataValue)
{
返回“+dataValue.getName()+”

+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();
    }
 }
公共类HintController实现ItemHoverHandler
{
私有最终枚举>枚举类;
公共HintController(枚举>枚举类)
{
numclass=enumClass;
}
@凌驾
公共作废事件(ItemHoverEvent事件)
{
FormItem FormItem=event.getItem();
枚举>枚举值=
Enum.valueOf(thenumclass.getDeclaringClass(),formItem.getValue().toString());
字符串提示=(enumValue instanceof DataValue)
?getPromptForDataValue((DataValue)枚举值)
:null;
formItem.setPrompt(prompt);
}
私有字符串getPromptForDataValue(DataValue DataValue)
{
返回“+dataValue.getName()+”

+dataValue.getDescription(); } }

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

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

公共类数据值
{
公共字符串getName(){…}
公共字符串getValue(){…}
公共字符串getDescription(){…}
}

如果您这样做,那么只需将数据值放入悬停事件中,然后直接从中获取信息。

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

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

    private final T theEnumClass;

    //and so on...
公共类HintController实现ItemHoverHandler{
私人期末考试;
//等等。。。

但是,请注意,
numclass
可能被错误命名,因为它只指向enum
T
的一个实例。您可能希望使用
Class
来代替。这将允许您调用反射方法。

您可以通过在
Hin上放置一个实类型参数来消除警告t控制器

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();
    }

}
公共类HintController实现ItemHoverHandler{
私人期末班-数学班;
公共铰链控制器(类enumClass){
numclass=enumClass;
}
@凌驾
公共作废事件(ItemHoverEvent事件){
FormItem FormItem=event.getItem();
E enumValue=Enum.valueOf(theEnumClass,(String)formItem.getValue());
字符串提示符=(enumValue instanceof DataValue)?getPromptForDataValue((DataValue)enumValue):null;
formItem.setPrompt(prompt);
}
私有字符串getPromptForDataValue(DataValue DataValue){
返回“+dataValue.getName()+”

“+dataValue.getDescription(); } }
考虑到对使用它的其他类的影响,我不能说这是否合理。我可以想象它会是-任何创建类的地方都已经对
enumClass
构造函数参数的类型有了一些想法,它可以简单地传播到
HintController
。以其他方式使用它的地方总是可以称之为
HintController