2016-04-15 5 views
-1

「犬は陸に住み、魚は水に生き、カエルは水と陸に住んでいます」というような関係を想像してみてください。したがって、関係は動物とその関連する生活環境です。だから私は自分の犬クラス、魚クラス、その他の動物を持っています。私は自分自身の土地クラス、水クラス、および両方のクラスも持っています。これらのクラスはいずれも抽象クラスEnvironmentを拡張しています。実際のJavaクラスを返します

それぞれの環境タイプを説明に関連付けたいと思っているので、私はHashMapを作成します。

しかし、コードを実行すると、HashMapをHashMap < "環境のいくつかのサブクラス"、String>にします。

ここで、タイプ犬、カエル、またはどんな種類の動物であるオブジェクトaがあるとしましょう。 HashMap<Environment, String> = new HashMap<a.getAssociatedEnvironment(), String>;

このgetAssociatedEnvironment()メソッドを作成するにはどうすればいいですか?文字通り次のようなことができますか:

public Class<T> getAssociatedEnvironment(Animal a) { 
    if(a instanceof Dog) 
     return Dog.class 
    if(a instanceof Frog) 
     return Frog.class 
    . . . 
} 
+2

getAssociatedEnvironmentという名前のメソッドのAnimalクラスを返しますか? –

+2

土地や水が環境のインスタンスになるように私に聞こえ、動物のクラスは環境のリストに関連付ける必要があります。土地、水、そして両方のクラスを作るのは間違っているようです。たとえば、Bothのインスタンスを作成することはあまり意味がありません。 – user2357112

+0

@ user2357112が持っている - 実際の解決策が見つかった場合、あなたは「このコードをどうやって解決するか」と尋ねるところで、実際に[XY問題](http://mywiki.wooledge.org/XyProblem)上記のユーザーのコメントによって推奨されるアプローチは、まったく別のアプローチを使用することです。 –

答えて

1

タイプ引数を動的に作成することはできません。
実行時には、ジェネリック型の実際の型情報もありません。
下位互換性のある純粋なコンパイル時型チェックです。

そして、あなたは、あなたがマップするかしないものを追加するかどうかに応じて、

HashMap<? extends Environment, String> h = new HashMap<>; 

または

HashMap<? super Environment, String> h = new HashMap<>; 

を使用する場合があります。このことについてより深く理解する必要がある場合は、ジェネリックスの詳細をお読みください。そのほかに:-)


、あなたはLandWaterではなくLandAnimalWaterAnimalをインタフェースし、その後DogLandAnimalを実装作り、FishWaterAnimalを実装し、Frogの両方を実装したいかもしれません。

関連する問題