Java:特定のenumsとジェネリックEnum<?> パラメータ
-
19-09-2019 - |
質問
思いの他のenum値方式のユーティリティクラスは、他の列挙値の列挙型です。のようなこと:
public class XMLUtils {
public static Enum<?> getEnumAttribute(Element element, String name,
Enum<?> defaultValue) {
if (element.hasAttribute(name)) {
String valueName = element.getAttribute(name);
// search for value
for (Enum<?> value: defaultValue.getClass().getEnumConstants())
if (value.toString().equalsIgnoreCase(valueName))
return value;
}
// not found, return default value
return defaultValue;
}
}
利用方法 getEnumAttribute()
:
// simple enum
public enum EUploadMethod {
INSERT, UPDATE, DELETE
}
// read enum value from XML config file
EUploadMethod method = XMLUtils.getEnumAttribute(element, "method",
EUploadMethod.INSERT);
このコードが十分に機能 Eclipse統行っていない警告 又は誤動作することなどが魅力。
しかしクリーンでコンパイルプロジェクトからのコマンドライン によるMaven2、失敗したデータ抽出処理がエラー 線が getEnumAttribute
という:
$ mvn clean compile
....
[ERROR] /home/.... DataUploader.java:[173,53] inconvertible types
found : java.lang.Enum<capture#414 of ?>
required: .....DataUploader.EUploadMethod
を使用していSun JDK1.6はEclipseとMaven:
$ mvn -version
Apache Maven 2.2.1 (r801777; 2009-08-06 21:16:01+0200)
Java version: 1.6.0_14
Java home: /usr/lib/jvm/java-6-sun-1.6.0.14/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux" version: "2.6.27-17-generic" arch: "i386" Family: "unix"
ご質問:
なぜこのコードはcompilableと 機能Eclipse, は、コンパイル 失敗にMaven を使ってください同じjavacコンパイラ?
何が悪いとともに特定のenums一般的に
Enum<?>
パラメータ?
おかげさ
マーティンSchayna
解決
Javaコンパイラは、javacいの違い、特に、ジェネリック医薬品.このeclipseが正しいものはどこでもかまいません)
試
public static <T extends Enum<T>> Enum<T> getEnumAttribute(Element element, String name, Enum<T> defaultValue) { ... }
他のヒント
私は、使用しているのEclipseのバージョンを知りませんが、私はそれがここで間違っていると思います。私のバージョンは、あなたが本物のエラーのように見えるのMaven、と見ている同じエラーを報告します。
問題は、あなたが"?"
の署名に2つのワイルドカード(getEnumAttribute()
)を持っていますが、同じようにそれらを強制的に何の制約は(またそれが1つを作成することが可能である)がないことです。だから、クライアントは、デフォルト値として1型の列挙型を渡すと引き換えに異なる型の列挙型を得ることができます。
あなたが名前付きの型パラメータで両方のワイルドカードを交換することによって、呼び出し元のコードのエラーを排除することができます:
class XMLUtils {
@SuppressWarnings("unchecked")
public static <E extends Enum<E>> E getEnumAttribute(Element element, String name,
E defaultValue) {
if (element.hasAttribute(name)) {
String valueName = element.getAttribute(name);
// search for value
for (Enum<?> value: defaultValue.getClass().getEnumConstants())
if (value.toString().equalsIgnoreCase(valueName))
return (E) value;
}
// not found, return default value
return defaultValue;
}
}
しかしEnum<E>.getClass()
戻り、コンパイラがClass<Enum<?>>
配列に含まれる列挙型のタイプを伝えることができないので、enumConstants
ので、私は、それが未チェックのキャストを排除することが可能だとは思わない。