私はジェネリックに不慣れです。
Map
のようなものを持つ
private static Map<String, Object> map;
とのような方法
public <T> T getObject(final Class<T> myClass) {
return (T)map.get(myClass);
}
メソッドから戻るときにキャストを実行する必要がないように、マップ宣言を変更するにはどうすればよいですか?
ジェネリックメソッドではなく、ジェネリッククラスを作成する必要があります。
public class MyClass<T> {
private Map<String, T> map;
public T getObject(final String key) {
return map.get(key);
}
}
また、パラメータをクラスから文字列に変更しました。map.get()が文字列を期待している場合、クラスを渡すことは意味がありません。
編集:マップが静的であることに気づきませんでした。プログラムの他の部分を壊さずに非静的に変更できる場合、これは機能する可能性があります。できない場合は、キャストを避けることはできません。
マップの修飾子を削除する場合はstatic
、次のようにすることができます。
public class MyClass<T> {
private Map<String, T> map;
public T getObject(final Class<T> myClass) {
return map.get(myClass);
}
}
さもないと:
次の任意の場所でジェネリッククラスCの型パラメーターを参照すると、コンパイル時エラーになります。
- Cの静的メンバーの宣言
( JLSからの抜粋)。これにより、パラメーター化されたクラスを使用して上記を実現できなくなります。
ただし、実行しようとしていたのは、パラメーター化されたメソッドのタイプパラメーターを別のメンバー(たまたま静的でもある)から参照することです。これも到達不能です。
get()メソッドがオブジェクトを返すため、キャスト操作を回避することはできません。詳細については、こちらを参照してください