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

问题描述:

我需要一般方法和泛型的帮助。基本的泛型方法以及如何从非泛型类调用方法?

这里是我卡与规格:

在MyPets类以上,添加花费T作为参数的方法。这种称为myGenericMethod的方法将调用makeNoise。在这个方法中为你的两个宠物调用makeNoise方法。

问题是我如何从动物类(非泛型类)调用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? 

    } 
} 

谢谢。

+2

'Animal'和'MyPets'之间有什么关系?你想成为什么? – 2013-03-20 20:59:26

+1

我有延长动物的狗和猫类。基本上在主类中,我创建了1个狗和1个猫对象,然后使用从MyPets类创建的泛型类进行参数化。 – 2013-03-20 21:03:32

你只需要你的泛型类型声明,以反映它扩展了动物:

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

谢谢。 在这里做诡计。 – 2013-03-20 21:18:37

,你可以声明你的对象:

MyPets<Animal> obj; 

你把它叫做:

obj.myGenericMethod(Animal aimal); 

无论是从MyPets删除该类型的参数,使myGenericMethod只是采取Animal,或者声明T作为有界通配符必须是Animal或某些子类型:

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

可以做的就是投tAnimal另一件事,即Animal animalT = (Animal) t;。但是如果你这样做的话,那么宣称myGenericMethod首先是T毫无意义。

+0

谢谢。你和GriffeyDog有相同的答案,我正在寻找。它以我想要的方式工作! – 2013-03-20 21:17:38

如果我正确理解你的问题,你需要修改,像这样你MyPets类:

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

现在您有一个通用的MyPets类,将T限制为Animal的实例,并且您知道Animal的所有实例都有一个makeNoise方法,您可以在myGenericMethod中安全地拨打T#makeNoise()

这可以让你如下解决您的问题:

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()); 
+0

感谢您的详细解答。我已经理解了这个概念:)。 – 2013-03-20 21:28:44