gpt4 book ai didi

java - 我怎样才能包装一个 Java 枚举并仍然对其进行迭代?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:04:15 26 4
gpt4 key购买 nike

我怎样才能拥有抽象枚举或某种基本枚举?

在我的通用代码中,我想要一个枚举占位符 MyItems 的概念,而不是将自己绑定(bind)到一个具体的枚举上。然后在我的每个项目中我都会有一个具体的实现。

例如通用代码

public interface MyItems {
// Marker interface
}

项目A

public enum Items implements MyItems {
RED_CAR, BLUE_CAR, GREEN_CAR;
}

项目 B

public enum Items implements MyItems {
BROWN_TREE, GREEN_TREE;
}

这似乎可行,但在我的通用代码中,我无法在我的接口(interface)枚举上编写循环,因为它不是枚举。在我的常用代码中,我想写

for (MyItems item : MyItems.values())
doSomething(item);

但我不能,因为我的界面只是一个标记界面,它没有 .values()。

非常感谢任何建议。我不知道我是否以完全错误的方式尝试。

最佳答案

这样做真的没有意义 - 因为 values() 方法是静态的。要调用它,您需要知道要调用它的类型。

最接近的是:

public interface MyItemsFactory<T extends MyItems>
{
Iterable<T> values();
}

然后以某种通用方式实现它,例如

public class EnumFactory<T extends Enum<T> & MyItems>
implements MyItemsFactory<T>
{
private final Class<T> clazz;

public EnumFactory(Class<T> clazz)
{
this.clazz = clazz;
}

public Iterable<T> values()
{
return EnumSet.allOf(clazz);
}
}

但基本规则是多态性和静态方法不能混用。在您的通话中:

for(MyItems item : MyItems.values())
doSomething(item);

您希望它迭代 MyItems 的哪个实现?您可能有大量实现 MyItems 的类型。

关于java - 我怎样才能包装一个 Java 枚举并仍然对其进行迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1599885/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com