代码之家  ›  专栏  ›  技术社区  ›  luis.espinal

将instanceof与Java枚举一起使用

  •  1
  • luis.espinal  · 技术社区  · 16 年前

    我有一种情况,我收到了 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<?> 可以是 MyEnum

    所以 instanceof 测试应该是可行的,但在测试的一般定义中似乎有一些东西 Enum (可能还有枚举不能扩展的事实),这会导致编译器对该特定语句感到恶心。

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

    • 路易斯。
    4 回复  |  直到 16 年前
        1
  •  3
  •   Joachim Sauer    16 年前

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

    Enum<? extends 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());
        }
    }
    

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

        2
  •  2
  •   Droo    16 年前

    如果两者都是一样的,为什么还要麻烦呢?

    public static MyEnum enumToEnum(final Enum<? extends Enum<?>> externalEnum)
    {
        try
        {
            return MyEnum.valueOf(externalEnum.name());
        }
        catch (Exception ex)
        {
            return MyEnum.UNKNOWN;
        }
    }
    
        3
  •  1
  •   David Moles paddy-p    16 年前

    我想你是说 externalEnum 而不是 enumType

    修复了这个问题,它在Eclipse中编译并使用ant。

        4
  •  1
  •   BalusC    16 年前

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

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