繁体   English   中英

在Java Enums中使用instanceof

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM