0

一般的なジェネリック メソッドとジェネリックについて助けが必要です。

これが私が立ち往生している仕様です:

上記の MyPets クラスで、T をパラメーターとして受け取るメソッドを追加します。myGenericMethod と呼ばれるこのメソッドは、makeNoise を呼び出します。このメソッド内で両方のペットに対して makeNoise メソッドを呼び出します。

質問は、Animal クラス (非ジェネリック クラス) から makeNoise メソッドを呼び出す方法です。リフレクションを使用する必要がありますか?

    public class MyPets<T>{

//creating the myGenericMethod with T as its parameter.

    public void myGenericMethod(T t){

// How do I call the makeNoise() from Animal class here? 

    }
}

ありがとう。

4

4 に答える 4

2

Animal を拡張することを反映するには、ジェネリック型宣言が必要です。

public class MyPets<T extends Animal> {
  public void myGenericMethod(T t) {
    t.makeNoise();
  }
}
于 2013-03-20T21:12:24.843 に答える
1

から型パラメーターを削除しMyPetsmyGenericMethodだけを取るか、 または何らかのサブタイプでなければならない境界付きワイルドカードとしてAnimal宣言します。TAnimal

class MyPets<T extends Animal> {
  public void myGenericMethod(T t) {
    // you can call Animal methods on t here
  }
}

あなたができるもう一つのことは、単にキャストtすることです。しかし、それを行う場合、そもそもa を取ると宣言しても意味がありません。AnimalAnimal animalT = (Animal) t;myGenericMethodT

于 2013-03-20T21:11:47.437 に答える
0

オブジェクトを次のように宣言できます:

 MyPets<Animal> obj;

あなたはそれを呼びます:

obj.myGenericMethod(Animal aimal);
于 2013-03-20T21:06:13.297 に答える
0

あなたの質問を正しく理解できたら、次のMyPetsようにクラスを修正する必要があります。

public class MyPets<T extends Animal> {
   public void myGenericMethod(T t) {
       t.makeNoise()
    }
}

のインスタンスに制限するジェネリックMyPetsクラスがあり、 のすべてのインスタンスにメソッドがあることがわかったので、 を安全に呼び出すことができます。TAnimalAnimalmakeNoiseT#makeNoise()myGenericMethod

これにより、次のように問題を解決できます。

MyPets<Dog> myDog;
MyPets<Cat> myCat;

myDog = new MyPets<Dog>();
myDog.myGenericMethod(new Dog());

myCat = new MyPets<Cat>();
myCat.myGenericMethod(new Cat());

以下も技術的には正しいことに注意してください。

MyPets<Animal> myPet;

myPet = new MyPets<Animal>();
myPet.myGenericMethod(new Dog());
myPet.myGenericMethod(new Cat());
于 2013-03-20T21:21:21.667 に答える