首页 > 解决方案 > 具有多个实现接口的枚举的 Java 泛型

问题描述

我想将枚举类列表传递给一个方法,其中所有枚举都实现一个公共接口,并让该方法返回枚举值之一。

查看Java Generics Wildcarding With Multiple Classes,似乎

public class Main
{
    interface Foo {}

    enum First implements Foo {
        A, B, C;
    }

    enum Second implements Foo {
        X, Y, Z;
    }

    interface Bar {}

    enum Third implements Bar {
        M, N, P;
    }
    enum Fourth implements Bar {
        A, X, Z;
    }


    public static <I, T extends Enum<?> & I> 
      I enumVarArgs(Class<? extends T>... classes) 
    {
        // Do stuff and return some instance of T
        return null;
    }

    public static void main(String[] args) {
        Foo foo = enumVarArgs(First.class,
                              Second.class);
        Bar bar = enumVarArgs(Third.class,
                              Fourth.class);
    }
}

应该做我想做的。但是,这无法在 Java 10 下编译:

[ERROR] /me/test/src/main/java/test/Main.java:[17,42] error: unexpected type
  required: class
  found:    type parameter I
  where I,T are type-variables:
    I extends Object declared in method <I,T>enumVarArgs(Class<? extends T>...)
    T extends Enum<?>,I declared in method <I,T>enumVarArgs(Class<? extends T>...)
[INFO] 1 error

从错误消息中,我猜 Java 希望我做类似的事情T extends Enum<?> & Serializable,我传递一个实际的接口,而不是一个类型参数。但是,我需要 API 是通用的,以便I保持通用参数。

是否有使这项工作有效的语法?

如果重要的话,我们正在使用 Java 10。

标签: javagenericsenums

解决方案


我认为你需要的是:

interface OnlyImpelents<T> {}
interface Foo extends OnlyImpelents<Foo> {}
interface Bar extends OnlyImpelents<Bar> {}

static <T extends Enum<?> & OnlyImpelents<? super T>> T enumVarArgs(T... values) {
    return values[0];
}
public static void main(String[] args) {
    Foo foo = enumVarArgs(First.A, Second.X);
}

标记接口OnlyImpelents<T>阻止任何类同时实现FooBar

从枚举类中获取枚举值的唯一方法是通过反射,它不需要具有静态类型。个人认为这不是一个好的面向对象设计,使用T...as args 应该会更好


推荐阅读