在Java Enums中使用instanceof

时间:2009-11-03 14:28:42

标签: java generics enums instanceof

我遇到的情况是我从外部系统收到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无法扩展的事实)会导致编译器对该特定内容产生影响言。

对我而言,解决方法很简单,但我希望能够很好地理解这些问题,并对此有任何见解。

  • 路易斯。

4 个答案:

答案 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。考虑到这一点。