2009-08-27 18 views
3

私は警察と救急車が、私はJavaのジェネリック/継承

HashMap<Integer, HashMap<Integer, Rescue>> getRescue(){ 
    if (a) return time_id_police; 
    else return time_id_ambulance; 
} 

どちらも、このようなメソッドを持つことができるか、救助を拡張し、両方のタイプ

HashMap<Integer, HashMap<Integer, Police>> time_id_police; 
HashMap<Integer, HashMap<Integer, Ambulance>> time_id_ambulance; 

の2つのハッシュマップを、持っている場合戻り値の型を

HashMap<Integer, HashMap<Integer, ? extends Rescue>> 

に変更することもできません。

ありがとうございます。

答えて

3

明らかにHashMap<Integer, HashMap<Integer, Rescue>>が間違っているという多くの場所に比べて(あなたのオブジェクトをインスタンス化)一箇所の変更をしなければなりませんにHashMap<Integer, Ambulance>を付けてください。 Rescue? extends Rescueに変更した場合も同様のことが行われます。

ただし、? extendsを2回使用すると、タイプシステムが破損することはありません。

HashMap<Integer, ? extends HashMap<Integer, ? extends Rescue>> getRescue() { 

ほとんどのJavaプログラマーではなく、特定の実装よりも種類が多くの一般的なMapを使用することを好みます。ちなみに

Map<Integer, ? extends Map<Integer, ? extends Rescue>> getRescue() { 

、あなたはより簡潔な三項演算子を使用するようにメソッドの本体を変更した場合:

return a ? time_id_police : time_id_ambulance; 

コンパイラはあなたのためのタイプをうまくいくようあなたは、もう少し有用なエラーメッセージが表示されます:

R.java:18: incompatible types 
found : java.util.HashMap<java.lang.Integer,capture of ? extends java.util.HashMap<java.lang.Integer,? extends Rescue>> 
required: java.util.HashMap<java.lang.Integer,java.util.HashMap<java.lang.Integer,Rescue>> 
    return a ? time_id_police : time_id_ambulance; 
     ^
1 error 
+0

ちょうど私が望むもの。実際のマップは5レベルの深さであるため、かなり冗長です:)ありがとうございます –

+0

私はあなたが何をしているのか正確には分かりませんが、キーオブジェクトを導入する価値があるかもしれません。あなたのネストされたマップのために。 –

0
はあなたがあなたが使用Map実装を変更することにした場合、あなただけよあなたはまた、地図の代わりにHashMap、この方法として宣言することがあります

HashMap<Integer, HashMap<Integer, Rescue>> time_id_police; 
HashMap<Integer, HashMap<Integer, Rescue>> time_id_ambulance; 

にtime_id_policeとtime_id_ambulanceのあなたの宣言を変更し

(あなたがオブジェクトを使用する場合)、値がに置き換えることもできるので、

Map<Integer, Map<Integer, Rescue>> time_id_police = new HashMap<Integer, HashMap<Integer, Rescue>>(); 
+0

これらの変更により、救急車がtime_id_policeに入れられていないことをどのように確認できますか? – Zed

+0

これらのタイプの 'time_id_ *'は間違っています... –

+0

@Zed、できません。最善の回避策は、警察や救急車のコレクションのユーザーから実装の詳細を隠すラッパークラスを作成することです。 – Glen

関連する問題