Fw: Generics in enums

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<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.
>
> the idea is to do something like this:
>
> interface Color<T extends PurePixel> {
>      public boolean filter(T pixel) {...}
>      public T make() {...}
> }
>
> public enum PurePixelColor implements Color<PurePixel> {
>      RED("Red"),
>      GREEN("Green"),
>      BLUE("Blue");
>
>      private PurePixelColor(String color) {...}
>
>      public boolean filter(PurePixel pixel) {...}
>
>      public PurePixel make() {...}
> }
>
> public enum MixedPixelColor implements Color<MixedPixel> {
>      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<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