以下の状況でジェネリックを使用できるかどうかを判断しようとしています。それは私のコードで最もよく記述することができます。 (このコードは単なる一例であり、私は私がいる問題に関係のないコードの大部分を取り出した)ジェネリックでメソッドのマップを使用する
public class FooBar {
public <T extends MyModel> Map<Class<T>, List<T>> convertToModelList(
Map<String, Class<T>> infoMap) {
// do stuff...
}
}
public class MyClient {
public void doSomething() {
Map<String, Class<? extends MyModel>> oldMap = new HashMap<String, Class<? extends MyModel>>();
oldMap.put ("car", Car.class);
oldMap.put("truck", Truck.class);
FooBar f = new FooBar();
Map<Class<? extends MyModel>, List<? extends MyModel>> newMap = f
.convertToModelList(oldMap);
}
}
public class Car extends MyModel {
}
public class Truck extends MyModel {
}
public class MyModel {
}
コンパイラはので、私は(MyClientという中)convertToModelListを呼び出すことはできませんと言っていますMap<String, Class<? extends MyModel>>
はMap<String, Class<T>>
と等価ではありません。なぜこれが起こっているのか、私は幾分理解していますが、これを回避する方法はありますか?
EDIT:
具体的には、私が解決したい問題は、上記convertToModelList()メソッドでジェネリックを使用しています。ここでジェネリックを使用できない場合、そのメソッドから返されたものはすべてクライアントにキャストする必要があります。例えば、私はこれにFooBarのを変更した場合:私はconvertToModelListに
Map<String, Class<Truck>>
に渡すと
public class FooBar {
public Map<Class<? extends MyModel>, List<? extends MyModel>> convertToModelList(
Map<String, Class<? extends MyModel>> infoMap) {
// do stuff...
}
}
、それはしかし、クライアントはしません、
Map<Class<Truck>, List<Truck>>
を返します。それがTruckだと分かります - それはMyModel型であることがわかります - Genericsを使用するとMyClientコードでTruckへのキャストを避けることができます:
public class MyClient {
public void doSomething() {
Map<String, Class<? extends MyModel>> oldMap = new HashMap<String, Class<? extends MyModel>>();
oldMap.put ("car", Car.class);
oldMap.put("truck", Truck.class);
FooBar f = new FooBar();
Map<Class<? extends MyModel>, List<? extends MyModel>> newMap = f
.convertToModelList(oldMap);
// I'm trying to avoid this cast
List<Truck> trucks = (List<Truck>)newMap.get(Truck.class);
}
}
サンプルコードをもう少し整理する必要があります。私は制約がmyClientクラスからどこに来るのか分からない。そのクラスdefはFooBarの外にあり、を定義しているからである。私が推測できるいくつかの他のタイプミスが、むしろそうではありません。 –
可能な複製[Javaでは、そのクラスのインスタンスへのクラスのマップを作成することは可能ですか?](http://stackoverflow.com/questions/6795025/in-java-is-it-possible-to-create- a-map-of-classes-of-their-class) –
myClientクラスのコードを少し整理しました。 – acvcu