Java:特定枚举和通用枚举<&燃气轮机;参数
我想将任何枚举值传递给实用程序类中的方法,并获取相同枚举类型的另一个枚举值。大概是这样的:Java:特定枚举和通用枚举<&燃气轮机;参数,java,eclipse,generics,compiler-construction,javac,Java,Eclipse,Generics,Compiler Construction,Javac,我想将任何枚举值传递给实用程序类中的方法,并获取相同枚举类型的另一个枚举值。大概是这样的: public class XMLUtils { public static Enum<?> getEnumAttribute(Element element, String name, Enum<?> defaultValue) { if (element.hasAttribute(name)) { St
public class XMLUtils {
public static Enum<?> getEnumAttribute(Element element, String name,
Enum<?> defaultValue) {
if (element.hasAttribute(name)) {
String valueName = element.getAttribute(name);
// search for value
for (Enum<?> value: defaultValue.getClass().getEnumConstants())
if (value.toString().equalsIgnoreCase(valueName))
return value;
}
// not found, return default value
return defaultValue;
}
}
这段代码功能齐全,Eclipse编译并运行它时不会出现警告或错误,而且工作起来很有魅力
但是,当我使用Maven2从命令行清理并编译项目时,它失败了,在getEnumAttribute
调用的第行出现了错误:
$ mvn clean compile
....
[ERROR] /home/.... DataUploader.java:[173,53] inconvertible types
found : java.lang.Enum<capture#414 of ?>
required: .....DataUploader.EUploadMethod
问题:
Enum
参数有什么问题public static <T extends Enum<T>> Enum<T> getEnumAttribute(Element element, String name,
Enum<T> defaultValue) {
...
}
公共静态枚举getEnumAttribute(元素、字符串名称、,
枚举默认值){
...
}
我不知道您使用的是什么版本的Eclipse,但我认为这是错误的。我的版本报告了与Maven相同的错误,这似乎是一个真正的错误 问题是
getEnumAttribute()
的签名中有两个通配符(“?”
),但没有强制它们相同的约束(也不可能创建一个)。因此,客户机可以传入一种类型的枚举作为默认值,并获得另一种类型的枚举作为返回
通过使用命名类型参数替换两个通配符,可以消除调用代码中的错误:
class XMLUtils {
@SuppressWarnings("unchecked")
public static <E extends Enum<E>> E getEnumAttribute(Element element, String name,
E defaultValue) {
if (element.hasAttribute(name)) {
String valueName = element.getAttribute(name);
// search for value
for (Enum<?> value: defaultValue.getClass().getEnumConstants())
if (value.toString().equalsIgnoreCase(valueName))
return (E) value;
}
// not found, return default value
return defaultValue;
}
}
类XMLUtils{
@抑制警告(“未选中”)
公共静态E getEnumAttribute(元素、字符串名称、,
(默认值){
if(element.hasAttribute(name)){
字符串valueName=element.getAttribute(名称);
//寻找价值
对于(枚举值:defaultValue.getClass().getEnumConstants())
if(value.toString().equalsIgnoreCase(valueName))
返回(E)值;
}
//未找到,返回默认值
返回默认值;
}
}
但是我认为不可能消除未经检查的强制转换,因为
Enum.getClass()
返回class谢谢,你完全正确,伙计!使用您的替代方法签名,我的源代码可以在Eclipse和Maven中编译。我对两个编译器之间的差异有点困惑。。。无论如何,再次谢谢你!约束
是正确的,但您可以将T
(实际枚举类型)设置为返回类型,而不是enum
,后者是T
的抽象超类。感谢您的理论分析,特别是对两种不同枚举类型的“不必要”容差(一种用于defaultValue
,另一种用于结果)这很重要,但对我来说,它可能不会导致很多错误。为了完整性:我使用的是Eclipse3.5.1。我删除了maven-2标记,因为这不是一个与maven相关的问题,而是一个纯粹的Eclipse/javac编译器问题。Eclipse有自己的编译器,独立于JDK。这就是为什么它不需要安装JDK(您只需要JRE)
public static <T extends Enum<T>> Enum<T> getEnumAttribute(Element element, String name,
Enum<T> defaultValue) {
...
}
class XMLUtils {
@SuppressWarnings("unchecked")
public static <E extends Enum<E>> E getEnumAttribute(Element element, String name,
E defaultValue) {
if (element.hasAttribute(name)) {
String valueName = element.getAttribute(name);
// search for value
for (Enum<?> value: defaultValue.getClass().getEnumConstants())
if (value.toString().equalsIgnoreCase(valueName))
return (E) value;
}
// not found, return default value
return defaultValue;
}
}