Fw: Generics in enums (original) (raw)

Peter Levart peter.levart at gmail.com
Thu May 30 07:42:35 UTC 2013


On 05/30/2013 09:26 AM, Remi Forax wrote:

On 05/30/2013 09:06 AM, Victor Polischuk wrote:

Good day Joe,

Thank you for your prompt reply. If I understood you correctly, it is not the solution which can help me distinguish enum elements by type parameters. I would like to have restrictions on types which can be passed to a enum instance methods and reduce numbers of casts or "instanceof" checks for return values. In case of implementation of an interface I need to write something like: //---- public enum Color implements ColorAspect {...} //---- which is redundant since I can hardcode Pixel type everywhere within the enumeration but the initial intention is to specify type parameters for each enum value independently. the idea is to do something like this: interface Color { public boolean filter(T pixel) {...} public T make() {...} } public enum PurePixelColor implements Color { RED("Red"), GREEN("Green"), BLUE("Blue"); private PurePixelColor(String color) {...} public boolean filter(PurePixel pixel) {...} public PurePixel make() {...} } public enum MixedPixelColor implements Color { WHITE("White"); private MixedPixelColor(String color) {...} public boolean filter(MixedPixel pixel) {...} public MixedPixel make() {...} } if you compare with your current code, Color objects are not comparable to themselve anymore. and if the code of filter is the same for PurePixelColor and MixedPixelColor you have to extract it somewhere in a static method.

Or code it as a "default" method in Color interface if you can use JDK8 ;-)

Regards, Peter

The feature you ask was asked several times when java5 was released but was considered as a corner case that doesn't worth the added complexity to the implementation.

Sincerely yours, Victor Polischuk cheers, Rémi --- Original message --- From: "Joe Darcy" <joe.darcy at oracle.com> Date: 30 May 2013, 09:44:57 Hello Victor,

On 5/29/2013 11:25 PM, Victor Polischuk wrote: Greetings,

I beg pardon for the previous HTML mail. Some time ago I wanted to migrate our "commons-lang" enums to "java 5" enumerations, but I encountered an issue that it cannot be done without discarding generics since java enums do not support them. Let me show an example: //------ public final class ColorEnum extends org.apache.commons.lang.enums.Enum { public static final ColorEnum RED = new ColorEnum("Red"); public static final ColorEnum GREEN = new ColorEnum("Green"); public static final ColorEnum�BLUE = new ColorEnum("Blue"); public static final ColorEnum WHITE = new ColorEnum("White") { @Override public MixedPixel make() {...}� }; private ColorEnum(String color) {super(color);} public boolean filter(T pixel) {...} public T make() {...} } //------ And I wonder if there is a specific reason why I cannot convert it into something like:� //------ public enum Color { RED("Red"), GREEN("Green"), BLUE("Blue"), WHITE("White") { @Override public MixedPixel make() {...}� }; private Color(String color) {...} public boolean filter(T pixel) {...} public T make() {...} } //------ Thank you in advance. Sincerely yours, Victor Polischuk You can approximate this effect by having your enum implement an interface or even a generic interface. For some examples in the JDK see, javax.tools.StandardLocation and java.nio.file.LinkOption. HTH, -Joe



More information about the core-libs-dev mailing list