简体   繁体   中英

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)"

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 {
            ...
        }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM