我遇到的情况是我从外部系统收到enum
,我需要返回enum
我们自己的// externalEnum is guaranteed not to be null
public static MyEnum enumToEnum(final Enum<? extends Enum<?>> externalEnum)
{
if( externalEnum instanceof MyEnum )
{
return (MyEnum)enumType;
}
else
{
return MyEnum.valueOf(externalEnum.name());
}
}
。这两个枚举在其中具有完全相同的文字值:
MyEnum.valueOf(externalEnum.name())
但是,编译器会尖叫以下内容:
[javac] found : java.lang.Enum<capture#117 of ? extends java.lang.Enum<?>> [javac] required: myEnum [javac] if( externalEnum instanceof MyEnum )
我得到了该函数的一个版本,只需返回Enum<? extends Enum<?>>
就可以了 - 它有效,而这一切都很重要。但是,我对编译器错误感到困惑。
在这种情况下,我试图了解泛型的具体化过程。 Enum<?>
或MyEnum
的实例可以是instanceof
(假设后者永远不能是前者的子类型。)
所以Enum
测试应该可以工作,但是{{1}}的通用定义中似乎有某些东西(也许是Enums无法扩展的事实)会导致编译器对该特定内容产生影响言。
对我而言,解决方法很简单,但我希望能够很好地理解这些问题,并对此有任何见解。
答案 0 :(得分:3)
我的(可能有缺陷的)您的问题分析是您的类型定义中的两个通配符彼此分开:
Enum<? extends Enum<?>>
表示“扩展Enum的类型的枚举,扩展了某种未知类型”。
你想要的可能更像是这样:
Enum<T extends Enum<T>>
表示“扩展Enum of the self的类型的枚举”。这是一个奇怪的递归定义(以某种方式循环回Comparable<T>
),但它只是Enum
的定义。
当然,您的静态方法需要采用类型参数<T>
才能实现此功能。试试这个:
public static <T extends Enum<T>> MyEnum enumToEnum(final T externalEnum) {
if (externalEnum instanceof MyEnum) {
return (MyEnum) externalEnum;
} else {
return MyEnum.valueOf(externalEnum.name());
}
}
编辑:修复由错误标识符引起的编译器错误使得问题中的代码为我编译。所以我的分析肯定是有缺陷的; - )
答案 1 :(得分:2)
如果两者都相同,为什么还要打扰?
public static MyEnum enumToEnum(final Enum<? extends Enum<?>> externalEnum)
{
try
{
return MyEnum.valueOf(externalEnum.name());
}
catch (Exception ex)
{
return MyEnum.UNKNOWN;
}
}
答案 2 :(得分:1)
我认为你的意思是externalEnum
而不是enumType
在你的第一个回复陈述中。
修复后,它在Eclipse和ant中编译。
答案 3 :(得分:1)
我遇到的情况是我从外部系统收到一个枚举,我需要返回一个我们自己的枚举。
如果两个类都由不同的类加载器加载和/或具有不同的次要/主要版本,则instanceof将返回false。考虑到这一点。