【发布时间】:2019-03-08 17:06:35
【问题描述】:
我想将枚举类列表传递给一个方法,其中所有枚举都实现一个公共接口,并让该方法返回枚举值之一。
看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。
【问题讨论】:
-
您知道您的 A 和 X 会有所不同吗?即 First.a!=Fourth.a