基本泛型方法以及如何从非泛型类调用方法?

时间:2013-03-20 20:58:32

标签: java generics

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

这是我坚持的规范:

在上面的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 个答案:

答案 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());