作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我怎样才能拥有抽象枚举或某种基本枚举?
在我的通用代码中,我想要一个枚举占位符 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/
我是一名优秀的程序员,十分优秀!