enum
外部システムからを受け取っている状況があり、そのために自分のシステムを返却する必要がありenum
ます。2つの列挙型には、まったく同じリテラル値が含まれています。
// 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 <capture#117 of?java.lang.Enum <?>>を拡張します [javac]必須:myEnum [javac] if(externalEnum instanceof MyEnum)
単に返すだけで機能するその関数のバージョンを入手しましたMyEnum.valueOf(externalEnum.name())
-それは機能し、それが重要です。しかし、私はコンパイラエラーについて困惑しています。
この場合、ジェネリックの具体化プロセスを理解しようとしています。Enum<? extends Enum<?>>
またはのインスタンスは(後者が前者のサブタイプ以外のものになることは決してないという条件で)可能性がありますEnum<?>
。MyEnum
したがって、instanceof
テストは機能するはずですEnum
が、コンパイラーがその特定のステートメントを吐き出す原因となる何か(およびおそらく列挙型を拡張できないという事実)の一般的な定義に何かがあるようです。
回避策は簡単ですが、問題をよく理解したいので、これに関する洞察をいただければ幸いです。
- ルイス。