Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java Generic bound (constraint) for Enum

I'm trying to bound (constrain) a Java generic type variable to be an enum (any enum) and failing. Might you be able to tell me why?

import org.supercsv.cellprocessor.ift.CellProcessor;
import org.supercsv.cellprocessor.ift.StringCellProcessor;

public class ParseEnum<TEnum extends Enum> extends CellProcessorAdaptor implements StringCellProcessor {

    public Object execute(final Object value, final CsvContext context) {
        ...
        final TEnum result;
        if (value instanceof TEnum) {
            result = (TEnum) value;
        } else if( value instanceof String ) {
                result = TEnum.valueOf((String)value);
        } else {
            ...
        }
        ...
}

(These are bits of my actual code attempting to extend a SuperCSV CellProcessor. )

value instanceof TEnum gives me this error (in Eclipse):

"Cannot perform instanceof check against type parameter TEnum. Use its erasure Enum instead since further generic type information will be erased at runtime"

TEnum.valueOf((String)value) gives me this error:

"The method valueOf(Class, String) in the type Enum is not applicable for the arguments (String)"

like image 698
urig Avatar asked Feb 11 '13 14:02

urig


1 Answers

You'll have to pass the enum class to do that (just like EnumSet.allOf() does).

public class ParseEnum<TEnum extends Enum<TEnum>> extends CellProcessorAdaptor implements StringCellProcessor {

    private Class<TEnum> enumType;

    public ParseEnum(Class<TEnum> enumType) {
        this.enumType = enumType;
    }

    public Object execute(final Object value, final CsvContext context) {
        ...
        final TEnum result;
        if (value.getClass().equals(enumType)) {
            result = (TEnum) value;
        } 
        else if (value instanceof String) {
            result = Enum.valueOf(enumType, (String) value);
        } 
        else {
            ...
        }
like image 104
JB Nizet Avatar answered Nov 08 '22 22:11

JB Nizet