java - 将 Java 泛型与枚举一起使用

标签 java generics enums switch-statement

更新:感谢所有提供帮助的人 - 这个问题的答案在于我在更复杂的代码中没有注意到的内容以及我对 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() 的调用导致编译器告诉我我无法打开枚举,只能打开可转换的 int 值或枚举常量。

可以将以下方法添加到 MyEvent 中:

public Type getId()
{
    return super.getId();
}

一旦我这样做了,一切都完全按照我的预期进行。我不仅对为此寻找解决方法感兴趣(因为我显然有一个),我对人们可能对为什么这不起作用的任何见解感兴趣,正如我预期的那样。

最佳答案

Yishai 是对的,神奇的短语是“covariant return types”,它是 Java 5.0 中的新内容——您无法打开 Enum,但可以打开扩展 Enum 的 Type 类。 MyEvent 继承的 AbstractEvent 中的方法需要进行类型删除。通过覆盖它,您将以 Java 可以在运行时处理的方式将 getId() 的结果重定向到您的 Type 类。

关于java - 将 Java 泛型与枚举一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1173290/

相关文章:

java - 构建您的第一个应用程序 - Android

java - 如何使用 int 索引访问 TreeMap 中的项目?

java - 在Java中创建泛型类型的实例?

java - 是否可以有一个类型参数扩展另外 2 个类型参数?

c++ - 如何在不收到编译器警告的情况下使用 C++ 枚举

java - 将用户输入到 excel (Apache poi)

java - 暂停打印在 Java 中不起作用

java - 只是通过 Java 泛型类型,但仍然出现 not-within-its-bound 错误

swift - 使用 Swift 的无大小写枚举而不是真实大小写有技术原因吗?

python - 如何为 enum python 创建 getter