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 {
...
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With