How can I wrap a Java enum and still iterate over it?
enums, java
Solution
It doesn't really make sense to do this - because the `values()` method is static. To call it, you need to know the type you want to call it on.
The closest you could come would be to have:
public interface MyItemsFactory<T extends MyItems>
{
Iterable<T> values();
}
and then implement that in some generic way, e.g.
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);
}
}
But the basic rule is that polymorphism and static methods don't mix. In your call:
for(MyItems item : MyItems.values())
doSomething(item);
which implementation of `MyItems` would you expect it to iterate over? You could have loads of types implementing `MyItems`.
Problem
How can I have an abstract enum, or some kind of base enum? In my common code I'd like a notion of an enum placeholder, MyItems, without tying myself to a concrete enum. Then in each of my projects I would have a concrete implementation. E.g. Common Code ``` public interface MyItems { // Marker interface } ``` Project A ``` public enum Items implements MyItems { RED_CAR, BLUE_CAR, GREEN_CAR; } ``` Project B ``` public enum Items implements MyItems { BROWN_TREE, GREEN_TREE; } ``` This seems to work, but in my common code I can't write a loop over my interface enum, since it's not an enum. In my common code I'd like to write ``` for (MyItems item : MyItems.values()) doSomething(item); ``` but I can't because my interface is just a marker interface, and it doesn't have a .values(). Any suggestions greatly appreciated. I don't know if I'm trying in completely the wrong way.