Java Generics:ジェネリック型クラスのクラス型を指定するにはどうすればよいですか?

ニール

POJOを次のように指定しています。MyClass<U>ここUで、は汎用型パラメーターです。クラス参照を受け入れ、Class<T>タイプのマップにデータを入力するMap<String, T>(データを入力するマップを受け入れる)ユーティリティメソッドを作成しようとしています

このメソッドは次のように実装されます。

static void populateMap(Map<String, T> map, Class<T> type) {

    ...

    // Parses into the specified type and returns an object of that type.
    T obj = parse(..., type);
    map.put (key, obj);
    ...

    return map;
}

これは正常にコンパイルされます。呼び出し元ではMyClass、値として(タイプに関係なく)任意のインスタンスをマップに入力しようとしています。したがって、次のコードを使用します。

// Loses type information
Map<String, MyClass<?>> m = new HashMap<>();
populateMap(m, MyClass.class);

これはコンパイルされません。コンパイルエラー:

populate(Map<String,T>, Class<T>)タイプ...のメソッドは引数には適用できません(Map<String,MyClass<?>>, Class<MyClass>)

どうすればこれを修正できますか?

ポール・ベロリア

この場合、チェックされていないキャストをClass<MyClass<?>>次のように実行しても安全です

// This is okay because we're switching to a type with an unbounded wildcard -
// the behaviors of Class.newInstance and Class.cast are still safe.
@SuppressWarnings("unchecked") 
Class<MyClass<?>> classWithNarrowedType =
        (Class<MyClass<?>>)(Class<?>)MyClass.class;
populateMap(m, classWithNarrowedType);

これは、特にこのような呼び出しサイトが多数ある場合は、厄介な解決策ですが、クラスリテラルが生の型でパラメータ化され、MyClass<T>本質的に厄介なパラメータ化された型のファクトリとして使用されるという事実を回避することはできません

潜在的にクリーンなソリューションはpopulateMap、クラスリテラルの使用から切り離されます。

interface Parser<T> {

    T parse();
}

static void populateMap(Map<String, T> map, Parser<T> parser) { ... }

...

Map<String, MyClass<?>> m = new HashMap<>();
Parser<MyClass<?>> myClassParser = new Parser<MyClass<?>>() {
    @Override
    public MyClass<?> parse() {
        return parse(..., MyClass.class);
    }
};
populateMap(m, myClassParser);

余談ですが、より柔軟な署名をお勧めします(詳細については、PECS(Producer Extends Consumer Super)とは何ですか?を参照してください)。

static void populateMap(Map<String, ? super T> map, Parser<T> parser)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Javaの子クラスのジェネリック型を変更するにはどうすればよいですか?

分類Dev

Java:ジェネリック型からクラスリテラルを取得するにはどうすればよいですか?

分類Dev

Mapオブジェクトを2つのジェネリックパラメーターで拡張するJAVAジェネリック型を定義するにはどうすればよいですか?

分類Dev

Javaでジェネリッククラスのインスタンスを作成するにはどうすればよいですか?

分類Dev

Javaでジェネリック型をインスタンス化するにはどうすればよいですか?

分類Dev

Javaでジェネリック配列型をインスタンス化するにはどうすればよいですか?

分類Dev

Javaでジェネリック型をインスタンス化するにはどうすればよいですか?

分類Dev

Javaでオブジェクトのジェネリック型を動的に変更するにはどうすればよいですか?

分類Dev

ジェネリック型定義とランタイム型パラメーターから実行時にJava型オブジェクトを構築するにはどうすればよいですか?

分類Dev

Javaで、ジェネリック型のインスタンスでgetClassを呼び出すときに、raw型を回避するにはどうすればよいですか?

分類Dev

型パラメーターが指定されていない場合、Javaジェネリックrawクラスがオブジェクトへのすべてのジェネリックを消去するのはなぜですか?

分類Dev

Javaでジェネリック型を複数のクラスに拡張することは可能ですか?

分類Dev

クラスのサブクラスが正しい型のJavaを返すようにするにはどうすればよいですか

分類Dev

Javaでジェネリックリストを複製するにはどうすればよいですか?

分類Dev

Javaのメソッドにジェネリッククラスを渡すにはどうすればよいですか?

分類Dev

Javaでジェネリック型の固定サイズの配列を作成するにはどうすればよいですか?

分類Dev

Javaで、送信されたField変数でジェネリッククラスTを並べ替えるにはどうすればよいですか?

分類Dev

JavaでNumberクラスを拡張し、別のクラスで実行できるように、ジェネリックインターフェイスを正しく制限するにはどうすればよいですか?

分類Dev

Javaジェネリックを使用してビルダークラスを2回拡張するにはどうすればよいですか?

分類Dev

Java Pojoクラスで列挙型列を作成するにはどうすればよいですか?

分類Dev

列挙型がクラスの場合にJavaリフレクションを使用するにはどうすればよいですか?

分類Dev

「クエスチョンマーク(?)」型のジェネリックをJavaからC ++にエミュレートするにはどうすればよいですか?

分類Dev

JAVA:リフレクションでジェネリック型のコンストラクタを取得するかどうかわからない

分類Dev

Javaのジェネリック型:どのように適切に右のクラスの型を渡すには?

分類Dev

Javaでジェネリック型に制約を設定するにはどうすればよいですか?

分類Dev

ジェネリック型はJavaクラスファイルのどこに保存されますか?

分類Dev

Javaオブジェクトがscalaの列挙型であるかどうかをテストするにはどうすればよいですか?

分類Dev

Javaで「イベント駆動型」のバックグラウンドスレッドを作成するにはどうすればよいですか?

分類Dev

Java 8型推論-ジェネリックコンストラクターの削減はどのように行われますか?

Related 関連記事

  1. 1

    Javaの子クラスのジェネリック型を変更するにはどうすればよいですか?

  2. 2

    Java:ジェネリック型からクラスリテラルを取得するにはどうすればよいですか?

  3. 3

    Mapオブジェクトを2つのジェネリックパラメーターで拡張するJAVAジェネリック型を定義するにはどうすればよいですか?

  4. 4

    Javaでジェネリッククラスのインスタンスを作成するにはどうすればよいですか?

  5. 5

    Javaでジェネリック型をインスタンス化するにはどうすればよいですか?

  6. 6

    Javaでジェネリック配列型をインスタンス化するにはどうすればよいですか?

  7. 7

    Javaでジェネリック型をインスタンス化するにはどうすればよいですか?

  8. 8

    Javaでオブジェクトのジェネリック型を動的に変更するにはどうすればよいですか?

  9. 9

    ジェネリック型定義とランタイム型パラメーターから実行時にJava型オブジェクトを構築するにはどうすればよいですか?

  10. 10

    Javaで、ジェネリック型のインスタンスでgetClassを呼び出すときに、raw型を回避するにはどうすればよいですか?

  11. 11

    型パラメーターが指定されていない場合、Javaジェネリックrawクラスがオブジェクトへのすべてのジェネリックを消去するのはなぜですか?

  12. 12

    Javaでジェネリック型を複数のクラスに拡張することは可能ですか?

  13. 13

    クラスのサブクラスが正しい型のJavaを返すようにするにはどうすればよいですか

  14. 14

    Javaでジェネリックリストを複製するにはどうすればよいですか?

  15. 15

    Javaのメソッドにジェネリッククラスを渡すにはどうすればよいですか?

  16. 16

    Javaでジェネリック型の固定サイズの配列を作成するにはどうすればよいですか?

  17. 17

    Javaで、送信されたField変数でジェネリッククラスTを並べ替えるにはどうすればよいですか?

  18. 18

    JavaでNumberクラスを拡張し、別のクラスで実行できるように、ジェネリックインターフェイスを正しく制限するにはどうすればよいですか?

  19. 19

    Javaジェネリックを使用してビルダークラスを2回拡張するにはどうすればよいですか?

  20. 20

    Java Pojoクラスで列挙型列を作成するにはどうすればよいですか?

  21. 21

    列挙型がクラスの場合にJavaリフレクションを使用するにはどうすればよいですか?

  22. 22

    「クエスチョンマーク(?)」型のジェネリックをJavaからC ++にエミュレートするにはどうすればよいですか?

  23. 23

    JAVA:リフレクションでジェネリック型のコンストラクタを取得するかどうかわからない

  24. 24

    Javaのジェネリック型:どのように適切に右のクラスの型を渡すには?

  25. 25

    Javaでジェネリック型に制約を設定するにはどうすればよいですか?

  26. 26

    ジェネリック型はJavaクラスファイルのどこに保存されますか?

  27. 27

    Javaオブジェクトがscalaの列挙型であるかどうかをテストするにはどうすればよいですか?

  28. 28

    Javaで「イベント駆動型」のバックグラウンドスレッドを作成するにはどうすればよいですか?

  29. 29

    Java 8型推論-ジェネリックコンストラクターの削減はどのように行われますか?

ホットタグ

アーカイブ