我一般需要通用方法和泛型的帮助。
这是我坚持的规范:
在上面的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?
}
}
感谢。
答案 0 :(得分:2)
您只需要通用类型声明来反映它扩展了Animal:
public class MyPets<T extends Animal> {
public void myGenericMethod(T t) {
t.makeNoise();
}
}
答案 1 :(得分:1)
从MyPets
中删除类型参数,并使myGenericMethod
只需Animal
,或将T
声明为有界通配符是Animal
或某个子类型:
class MyPets<T extends Animal> {
public void myGenericMethod(T t) {
// you can call Animal methods on t here
}
}
但是,如果你这样做,那么宣布t
首先采用Animal
是毫无意义的。
答案 2 :(得分:0)
您可以将对象声明为:
MyPets<Animal> obj;
你称之为:
obj.myGenericMethod(Animal aimal);
答案 3 :(得分:0)
如果我理解你的问题,你需要修改你的MyPets
课程:
public class MyPets<T extends Animal> {
public void myGenericMethod(T t) {
t.makeNoise()
}
}
现在您有一个通用的MyPets
类,它将T
限制为Animal
的实例,并且您知道Animal
的所有实例都有makeNoise
方法,您可以安全地拨打T#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());