背景:我们当前正在正常使用的项目,用maven进行重构。
问题:用maven的命令编译时,报错!具体如下:
分析:在我对应的controller位置,代码如下:
(DefectActivityTypeEnum) StringUtils.transformStringToEnum(DefectActivityTypeEnum.class, operateType));
这样以前能正常使用,现在就不应该存在问题,所以问题很有可能是出在工具类StringUtils的对应方法里。
下面我们就去看看方法里
public static Enum<?> transformStringToEnum(Class<?> cls,String str){
return (Enum<?>) Enum.valueOf(cls, str);
}
返回的是Enum<?>, 在看看java.lang.Enum类的valueOf()方法里返回的是什么,
public static <T extends Enum<T>> T valueOf(Class<T> enumType,String name) {
T result = enumType.enumConstantDirectory().get(name);
if (result != null)
return result;
if (name == null)
throw new NullPointerException("Name is null");
throw new IllegalArgumentException(
"No enum const " + enumType +"." + name);
}
哦,返回的是 <T extends Enum<T>> T 虽然和Enum<?> 同样都是限定返回值是枚举,但是Enum<T>,限定了返回值只能是和后面valueOf()里的参数T 同一个类型,而 ?则无限定,包括null,这就导致了maven这种强编译型的编译条件会报错!
修改结果:将StringUtils里的功能函数改为以下代码:
public static <T extends Enum<T>> T transformStringToEnum(Class<T> cls,String str){
return Enum.valueOf(cls, str);
}
问题解决了,特此记录,以防自己再犯类似错误,要养成常看api的习惯,不能想当然的写代码!
勉之!