5

私はジェネリックに不慣れです。

Mapのようなものを持つ

private static Map<String, Object> map;

とのような方法

public <T> T getObject(final Class<T> myClass) {
    return (T)map.get(myClass);
}

メソッドから戻るときにキャストを実行する必要がないように、マップ宣言を変更するにはどうすればよいですか?

4

3 に答える 3

9

ジェネリックメソッドではなく、ジェネリッククラスを作成する必要があります。

public class MyClass<T> {
   private Map<String, T> map;

   public T getObject(final String key) {
    return map.get(key);
   }
}

また、パラメータをクラスから文字列に変更しました。map.get()が文字列を期待している場合、クラスを渡すことは意味がありません。

編集:マップが静的であることに気づきませんでした。プログラムの他の部分を壊さずに非静的に変更できる場合、これは機能する可能性があります。できない場合は、キャストを避けることはできません。

于 2012-06-13T10:35:18.460 に答える
0

マップの修飾子を削除する場合はstatic、次のようにすることができます。

public class MyClass<T> {

    private Map<String, T> map;

    public T getObject(final Class<T> myClass) {
        return map.get(myClass);
    }
}

さもないと:

次の任意の場所でジェネリッククラスCの型パラメーターを参照すると、コンパイル時エラーになります。

  • Cの静的メンバーの宣言

( JLSからの抜粋)。これにより、パラメーター化されたクラスを使用して上記を実現できなくなります。

ただし、実行しようとしていたのは、パラメーター化されたメソッドのタイプパラメーターを別のメンバー(たまたま静的でもある)から参照することですこれも到達不能です。

于 2012-06-13T10:45:49.577 に答える
0

get()メソッドがオブジェクトを返すため、キャスト操作を回避することはできません。詳細については、こちらを参照してください

于 2012-06-13T10:32:32.330 に答える