带有枚举和接口的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
可能被错误命名,因为它只指向enumT
的一个实例。您可能希望使用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