2009-08-28 27 views
0

私はクラスAnimalを持っていますし、それを拡張するDogとCatのクラスを持っています。私はいくつかの値に応じて、犬や猫を返すメソッドを次に持つことができますか?そう、このような何か、作業以外:java generics - メソッドの戻り値の型

public <T extends Animal> getAnimal(){ 
    if (a) 
    return new Dog(); 
    else 
    return new Cat(); 
} 
+0

。 – ChaosPandion

+6

これにジェネリックは必要ありません。ちょうど: public Animal getAnimal(bool a) は、DogとCatの両方がAnimalを拡張することを条件に、トリックを行う必要があります。 – chsh

+0

彼はおそらく実験中です。 – ChaosPandion

答えて

0

この状況でジェネリックを使用する必要はありません。

Animal GetAnimal(AnimalType type) 
{ 
    switch (type) 
    { 
     case AnimalType.Dog: 
      return new Dog(); 
      break; 
     case AnimalType.Cat: 
      return new Cat(); 
      break; 
    }  
} 

申し訳ありませんが、私はJavaを使用していません。

+1

これは正式なJavaとC#です。大文字のメソッド名はC#の方が慣れていますが、コンパイルすると思います。 –

+0

"質問の背後にある質問"を推測するだけです。あなたの機能の呼び出し元が、犬や猫を受け取ったかどうかを自動的に魔法で知る方法はありません。その検索語は「タイプ消去」です。要するに、ジェネリックでも、Dog d = getAnimal(AnimalType.Dog)をコンパイルする方法があります。 – stmoebius

1

そのような状況でジェネリックスを使用する必要はありません。単純に戻り値の型をAnimalにすると、Animalのサブクラスのいずれかを返すことができます。しかし、戻り値の型としてCollectionsを扱うときは、その狂気のジェネリックスのものを追加する必要があります。 IE。あなたはキャストする必要がC#で

private List<T extends Animal> method1() { 
    return new ArrayList<Dog>(); 
} 

private List<? super Dog> method() { 
    return new ArrayList<Animal>(); 
} 
-1
public <T extends Animal> T getAnimal(){ 
    if (a) 
    return (T) new Dog(); 
    else 
    return (T) new Cat(); 
} 
+0

-1これは型安全ではありません。たとえば、 'Fish f = this 'と書くことができます。 getAnimal(); 'それはコンパイルされます。 –