java - 具有多个实现接口的枚举的 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。
解决方案
我认为你需要的是:
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>
阻止任何类同时实现Foo
和Bar
从枚举类中获取枚举值的唯一方法是通过反射,它不需要具有静态类型。个人认为这不是一个好的面向对象设计,使用T...
as args 应该会更好
推荐阅读
- html - 如何在 github-pages 上的 mkdocs 生成网站中嵌入本地 pdf 文件?
- python - 如何为两个 QListWidgets 使用一个 Qscrollbar
- android-studio - 如何使用 Android Studio 在 Kotlin 中的 typealias 上抑制这个已弃用的警告?
- reactjs - 无法在用户数组中推送数据。承诺没有得到解决
- python - 我正在尝试应用多标签分类
- powershell-5.0 - 已卸载巧克力包,无法重新安装
- visual-studio - 使用 CMake 和 Visual Studio 自定义清理目标
- reactjs - React:在将外部数据存储在 Redux 后无法加载外部数据并将其传递给组件
- excel - 使用测量时,DAX 除法给了我奇怪的值
- python - 我正在尝试创建一个不和谐的机器人来播放音乐,它工作正常,但我的暂停和恢复命令不起作用