【发布时间】:2009-07-23 17:31:03
【问题描述】:
更新:感谢所有提供帮助的人 - 这个问题的答案在于我在更复杂的代码中没有注意到什么,以及我对 Java5 协变返回类型一无所知.
原帖:
今天早上我一直在玩一些东西。虽然我知道我可以以不同的方式解决整个问题,但我发现自己痴迷于弄清楚为什么它没有按我预期的方式工作。在花了一些时间阅读之后,我发现我并没有更接近理解,所以我把它作为一个问题提出来看看我是否只是愚蠢或者是否真的有一些我不明白的事情发生在这里.
我已经创建了一个自定义事件层次结构,如下所示:
public abstract class AbstractEvent<S, T extends Enum<T>>
{
private S src;
private T id;
public AbstractEvent(S src, T id)
{
this.src = src;
this.id = id;
}
public S getSource()
{
return src;
}
public T getId()
{
return id;
}
}
具体实现如下:
public class MyEvent
extends AbstractEvent<String, MyEvent.Type>
{
public enum Type { SELECTED, SELECTION_CLEARED };
public MyEvent(String src, Type t)
{
super(src, t);
}
}
然后我像这样创建一个事件:
fireEvent(new MyEvent("MyClass.myMethod", MyEvent.Type.SELECTED));
我的 fireEvent 定义为:
protected void fireEvent(MyEvent event)
{
for(EventListener l : getListeners())
{
switch(event.getId())
{
case SELECTED:
l.selected(event);
break;
case SELECTION_CLEARED:
l.unselect(event);
break;
}
}
}
所以我认为这很简单,但结果是对 event.getId() 的调用导致编译器告诉我我不能打开 Enums,只能打开可转换的 int 值或枚举常量。
可以在 MyEvent 中添加以下方法:
public Type getId()
{
return super.getId();
}
一旦我这样做了,一切都会完全按照我的预期进行。我不仅对找到解决方法感兴趣(因为我显然有一个),我对人们可能对为什么这不起作用的任何见解感兴趣,因为我期望它立即生效。
【问题讨论】:
-
克里斯,你能显示包含
fireEvent的类的类声明吗? -
问题真的是我的 AbstractEvent 比我在这里发布的要复杂得多。我应该创建玩具实现并在发布之前对其进行测试!感谢所有提供帮助的人!答案是我的 getId() 方法是“协变返回类型” - 我在定义为 Enum
返回类型的类中隐藏了另一个实现。当我放弃它时,switch 语句开始编译。 -
-0 至少要干净...
标签: java generics enums switch-statement