我试图将Java泛型类型变量绑定(约束)为枚举(任何枚举)并失败。你可以告诉我为什么吗?
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 {
...
}
...
}
(这些是我试图扩展SuperCSV CellProcessor的实际代码的一部分。)
value instanceof TEnum
给了我这个错误(在Eclipse中):
“无法对类型参数TEnum执行instanceof检查。使用它 擦除枚举,因为进一步的通用类型信息将是 在运行时删除“
TEnum.valueOf((String)value)
给了我这个错误:
“Enum类型中的方法valueOf(Class,String)不是 适用于参数(String)“
答案 0 :(得分:5)
你必须通过枚举类才能做到这一点(就像EnumSet.allOf()
那样)。
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 {
...
}