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