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

原文 标签 java generics enums multiple-bounds

我所拥有的没有任何问题:

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

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接口调用方法来处理那些枚举。

现在问题开始了:

但我也想将其中一些存储在这样的类的静态列表字段中:
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 - GWT Twitter分享按钮

c# - 您可以在C#中实例化通用类型参数的嵌套类型吗?

java - 了解Java中的语法

objective-c - 64位NS_OPTIONS位掩码

java - Eclipse提供什么功能来运行Eclipse中未包含的程序? [关闭]

java - 无法写字段名称,需要一个值

java - 是否可以在Java axis2客户端上为https捕获明文请求SOAP信封?

java - 具有多个类型参数的泛型辅助方法

enums - 如何获取枚举中元素(变量)的数量作为常数?

database - 字符串或枚举