如何包装Java枚举并仍然迭代它?

Pen*_*gin 3 java enums

我怎么能有一个抽象枚举,或某种基本枚举?

在我的通用代码中,我想要一个枚举占位符MyRetems的概念,而不是将自己与具体的枚举联系起来.然后在我的每个项目中,我都会有一个具体的实现.

例如共同代码

public interface MyItems {
    // Marker interface
}
Run Code Online (Sandbox Code Playgroud)

项目A.

public enum Items implements MyItems {
     RED_CAR, BLUE_CAR, GREEN_CAR;
}
Run Code Online (Sandbox Code Playgroud)

项目B.

public enum Items implements MyItems {
    BROWN_TREE, GREEN_TREE;
}
Run Code Online (Sandbox Code Playgroud)

这似乎有效,但在我的公共代码中,我不能在我的接口枚举上写一个循环,因为它不是枚举.在我的常用代码中,我想写

for (MyItems item : MyItems.values())
    doSomething(item);
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*eet 8

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

你最接近的将是:

public interface MyItemsFactory<T extends MyItems>
{
    Iterable<T> values();
}
Run Code Online (Sandbox Code Playgroud)

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

但基本规则是多态和静态方法不混合.在你的电话中:

for(MyItems item : MyItems.values())
    doSomething(item);
Run Code Online (Sandbox Code Playgroud)

MyItems您期望它实现哪个迭代?你可以有很多类型的实现MyItems.