[英]Using instanceof with Java Enums
我遇到从外部系统收到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());
}
}
但是,编译器发出以下声音:
[javac] found : java.lang.Enum<capture#117 of ? extends java.lang.Enum<?>> [javac] required: myEnum [javac] if( externalEnum instanceof MyEnum )
我得到了该函数的一个版本,可以通过简单地返回MyEnum.valueOf(externalEnum.name())
它的工作,这很重要。 但是,我对编译器错误感到困惑。
在这种情况下,我试图了解泛型的实现过程。 Enum<? extends Enum<?>>
的实例 Enum<? extends Enum<?>>
或简单地Enum<?>
可以是MyEnum
(假设后者不能是前者的子类型以外的任何东西)。
因此, instanceof
测试应该可以工作,但是Enum
的通用定义(似乎可能无法扩展Enums)中似乎有些东西导致编译器对该特定语句进行呕吐。
对我来说,解决方法很容易,但是我希望很好地理解问题,并且对此有任何见解将不胜感激。
我对您的问题的分析(可能是有缺陷的)是类型定义中的两个通配符彼此分开:
Enum<? extends Enum<?>>
意思是“一个扩展了Enum类型的Enum扩展了一些未知类型”。
您想要的可能更像这样:
Enum<T extends Enum<T>>
意思是“扩展自身枚举类型的枚举”。 那是一个奇怪的递归定义(以某种方式循环回到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());
}
}
编辑:修复由错误的标识符引起的编译器错误,使问题中的代码为我编译。 所以我的分析肯定是有缺陷的;-)
如果两者相同,为什么还要打扰呢?
public static MyEnum enumToEnum(final Enum<? extends Enum<?>> externalEnum)
{
try
{
return MyEnum.valueOf(externalEnum.name());
}
catch (Exception ex)
{
return MyEnum.UNKNOWN;
}
}
我认为您的意思是您的第一个return语句中的externalEnum
而不是enumType
。
修复后,它可以在Eclipse和ant中编译。
我遇到从外部系统收到枚举的情况,为此我需要返回自己的枚举。
如果两个类都由不同的类加载器加载和/或具有不同的次要/主要版本,则instanceof将返回false。 也要考虑到这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.