Fw: Generics in enums
Victor Polischuk
victor2 at ukr.net
Thu May 30 07:06:53 UTC 2013
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<Pixel> {...}
//----
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.
Sincerely yours,
Victor Polischuk
--- 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<T extends Pixel> extends org.apache.commons.lang.enums.Enum {
> > public static final ColorEnum<PurePixel> RED = new ColorEnum<PurePixel>("Red");
> > public static final ColorEnum<PurePixel> GREEN = new ColorEnum<PurePixel>("Green");
> > public static final ColorEnum<PurePixel>�BLUE = new ColorEnum<PurePixel>("Blue");
> > public static final ColorEnum<MixedPixel> WHITE = new ColorEnum<MixedPixel>("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<T extends Pixel> {
> > RED<PurePixel>("Red"),
> > GREEN<PurePixel>("Green"),
> > BLUE<PurePixel>("Blue"),
> > WHITE<MixedPixel>("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