java - 具有扩展多种类型的泛型参数的静态字段

标签 java generics enums multiple-bounds

我没有任何问题的是:

我有多个扩展相同接口(interface)的枚举:

interface CommonMethods {
    // some methods
}

enum E1 implements CommonMethods {
    O1, O2;
    // interface method impls
}

enum E2 implements CommonMethods {
    O3, O4;
    // interface method impls
}

我想通过它们的共同继承者来处理这些问题:EnumCommonMethods

到目前为止,我有这样的方法:

static <L extends Enum<?> & CommonMethods> void m(L l) {}

所以我可以使用这些枚举来做我想做的事,例如通过从 CommonMethods 接口(interface)调用方法。

现在问题开始了:

但我也想将其中一些存储在类的静态列表字段中,如下所示:

class Test1 {
    static List<Enum<?> & CommonMethods> l = new LinkedList<>();

    static {
        l.add(E1.O1);
        l.add(E2.O3);
    }
}

这给了我编译器错误。我有一个我认为不好的解决方法:

class Test2 {
    static List<Enum<?>> l = new LinkedList<>();

    static {
        l.add(E1.O1);
        l.add(E2.O3);
    }

    static <L extends Enum<?> & CommonMethods> void m(L l) {}
}

这样我就失去了可接受类型的约束。


我该怎么做才能保持约束?

注意:这只是一个虚拟代码,而不是我目前正在尝试使用的真实代码,因此请不要提出重构建议。

最佳答案

将类型声明为:

static <L extends Enum<? extends CommonMethods>> void m(L l) {}

我自己在大量研究之前和之后都遇到过这个问题,我得出的结论是这与类型交集的效果相同。

question ,其答案讨论了这个主题。

关于java - 具有扩展多种类型的泛型参数的静态字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38923418/

相关文章:

java - 通用 assertThat(ArrayList, hasItems(InstanceOfSomeInterface)) 不工作

c# - 为什么受 'Enum' 约束的泛型类型在 C# 7.3 中不符合 'struct' 的条件?

java - 确保使用每个枚举值

Java Applet 在浏览器中加载时卡住

java - GlassFish JDBC 连接池

swift - 是否可以向 Swift 协议(protocol)一致性扩展添加类型约束?

java - 变量的 Enum<> 泛型类型的使用

java - 从不同值转换为枚举值

java - Java 是否有不明确的语法,需要有关标识符的更多信息?

java - 实体需要什么状态才能触发【更新】操作?