2009-11-03 36 views
1

我有一種情況,我從外部系統收到enum,並且需要返回我們自己的enum。這兩個枚舉具有完全相同的文字值在其中:在Java中使用instanceof枚舉

// 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(也許事實上Enums不能被擴展)導致編譯器使用該特定語句嘔吐。

解決方法對我來說很簡單,但我喜歡很好地理解這些問題,任何有關此問題的見解都將受到讚賞。

  • Luis。
+0

您的錯誤消息包含一個小寫的「myEnum」,但在代碼中的任何位置都看不到小寫的「myEnum」。代碼中定義的小寫「myEnum」在哪裏?這個功能在做什麼? – 2009-11-03 14:35:04

+0

此外,是'返回(MyEnum)enumType;'故意,或者它應該是'返回(MyEnum)externalEnum'?當我改變它時,你的第一個例子適合我。 – gustafc 2009-11-03 14:38:57

回答

2

爲什麼即使打擾,如果兩者都是一樣的?

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

呃!好點子。這是驚人的,直到7個月後我才意識到這一點:) – 2010-05-27 18:52:32

3

我您的問題的(可能是有缺陷的)的分析是,在類型中定義的兩個通配符是彼此分開:

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

編輯:修復由錯誤的標識符引起的編譯器錯誤使問題中的代碼爲我編譯。所以我的分析肯定是有缺陷的;-)

1

我認爲你的意思是externalEnum而不是enumType在你的第一個return語句中。

修正後,它在Eclipse和ant中編譯。

1

我有一種情況,我從外部系統收到一個枚舉,並且需要返回一個我們自己的枚舉。

如果兩個類都由不同的類加載器加載和/或具有不同的次要/主要版本,instanceof將返回false。考慮到這一點。