我怎么能有一个抽象枚举,或某种基本枚举?
在我的通用代码中,我想要一个枚举占位符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().
任何建议都非常感谢.我不知道我是否完全以错误的方式尝试.
这样做没有意义 - 因为该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
.