0

我一般需要泛型方法和泛型方面的帮助。

这是我坚持的规范:

在上面的 MyPets 类中,添加一个以 T 作为参数的方法。此方法称为 myGenericMethod,将调用 makeNoise。在此方法中为您的两只宠物调用 makeNoise 方法。

问题是如何从 Animal Class(非泛型类)调用 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,要么声明T为必须是或某个子类型的有界通配符:Animal

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

您可以做的另一件事就是强制t转换为Animal,即Animal animalT = (Animal) t;。但如果你这样做,那么一开始就宣布myGenericMethod采取 a是没有意义的T

于 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 回答