【问题标题】:Using instanceof with Java Enums将 instanceof 与 Java 枚举一起使用
【发布时间】:2009-11-03 14:28:41
【问题描述】:

我有一种情况,我从外部系统收到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] 发现:java.lang.Enum> [javac] 必需:myEnum [javac] if( externalEnum instanceof MyEnum )

我通过简单地返回MyEnum.valueOf(externalEnum.name()) 获得了该函数的一个版本——它可以工作,这就是最重要的。但是,我对编译器错误感到困惑。

在这种情况下,我试图了解泛型的具体化过程。 Enum&lt;? extends Enum&lt;?&gt;&gt; 的实例或简单的 Enum&lt;?&gt; 可以是 MyEnum(鉴于后者只能是前者的子类型。)

所以instanceof 测试应该可以工作,但是Enum 的通用定义中似乎有一些东西(也许是枚举不能扩展的事实)导致编译器对该特定语句进行呕吐。

解决方法对我来说很简单,但我喜欢很好地理解问题,如果对此有任何见解,我们将不胜感激。

  • 路易斯。

【问题讨论】:

  • 您的错误消息包含一个小写的“myEnum”,但我在您的代码中没有看到小写的“myEnum”。您的代码中定义的小写“myEnum”在哪里?它在这个函数中做了什么?
  • 另外,return (MyEnum)enumType; 是故意的,还是应该是return (MyEnum)externalEnum?当我改变它时,你的第一个例子对我来说很好。

标签: java generics enums instanceof


【解决方案1】:

我对您的问题的(可能有缺陷的)分析是您的类型定义中的两个通配符彼此分开:

Enum<? extends Enum<?>>

表示“一个扩展了某个未知类型的枚举类型的枚举”。

你想要的可能更像这样:

Enum<T extends Enum<T>>

表示“扩展自身 Enum 的类型的 Enum”。这是一个奇怪的递归定义(它以某种方式循环回Comparable&lt;T&gt;),但这正是Enums 的定义方式。

当然,你的静态方法需要一个类型参数&lt;T&gt; 才能工作。试试这个:

public static <T extends Enum<T>> MyEnum enumToEnum(final T externalEnum) {
    if (externalEnum instanceof MyEnum) {
        return (MyEnum) externalEnum;
    } else {
        return MyEnum.valueOf(externalEnum.name());
    }
}

编辑:修复由错误标识符引起的编译器错误可以为我编译问题中的代码。所以我的分析肯定有缺陷;-)

【讨论】:

    【解决方案2】:

    如果两者都相同,为什么还要麻烦?

    public static MyEnum enumToEnum(final Enum<? extends Enum<?>> externalEnum)
    {
        try
        {
            return MyEnum.valueOf(externalEnum.name());
        }
        catch (Exception ex)
        {
            return MyEnum.UNKNOWN;
        }
    }
    

    【讨论】:

    • 呃!好点子。太神奇了,直到 7 个月后我才意识到这一点:)
    【解决方案3】:

    我认为您在第一个返回语句中的意思是 externalEnum 而不是 enumType

    已修复,它可以在 Eclipse 和 ant 中编译。

    【讨论】:

      【解决方案4】:

      我有一种情况,我从外部系统接收枚举,为此我需要返回我们自己的枚举。

      如果两个类由不同的类加载器加载和/或确实具有不同的次要/主要版本,则 instanceof 将返回 false。也要考虑到这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 2017-12-08
        相关资源
        最近更新 更多