2012-02-15 5 views
1

以下の状況でジェネリックを使用できるかどうかを判断しようとしています。それは私のコードで最もよく記述することができます。 (このコードは単なる一例であり、私は私がいる問題に関係のないコードの大部分を取り出した)ジェネリックでメソッドのマップを使用する

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); 
} 
} 
+1

サンプルコードをもう少し整理する必要があります。私は制約がmyClientクラスからどこに来るのか分からない。そのクラスdefはFooBarの外にあり、を定義しているからである。私が推測できるいくつかの他のタイプミスが、むしろそうではありません。 –

+1

可能な複製[Javaでは、そのクラスのインスタンスへのクラスのマップを作成することは可能ですか?](http://stackoverflow.com/questions/6795025/in-java-is-it-possible-to-create- a-map-of-classes-of-their-class) –

+0

myClientクラスのコードを少し整理しました。 – acvcu

答えて

0

CarTruckの共通のスーパークラスはMyModelList<Car>の共通のスーパークラスとList<Truck>Objectされている。マップはタイプMap<Class<? extends MyModel>, Object>>でなければなりません。あなたはより良いいくつかの不変のチェックでマップをラップし、代わりに、マップから直接情報を得ることのキャスト。

これも参考になります。Heterogeneous container to store genericly typed objects in Java

+0

Map 、Object>、Object型はList <? MyModel>を拡張します。それはMap 、List <? extends MyModel >>はうまくいくはずです。 – acvcu

+0

'List <?extends MyModel> 'も' List 'と' List 'のスーパータイプです – newacct

0

MyModelが拡張されているので、そのタイプのみが必要だと言います。

MyModelにするのは有効ですか? MyModelを拡張します。その後

Class<MyModel> 

、これは(すべての車とトラックされる、mymodelというのスーパーメソッドを呼び出す必要があります拡張するすべてのオブジェクト。これは、彼らが、このタイプのすべてであることを意味します。が、

+0

私はあなたの提案された解決策を本当に理解していません。 – acvcu

関連する問題