2013-03-20 167 views
0

我需要一般方法和泛型的幫助。基本的泛型方法以及如何從非泛型類調用方法?

這裏是我卡與規格:

在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

回答

2

你只需要你的泛型類型聲明,以反映它擴展了動物:

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

謝謝。 在這裏做詭計。 – 2013-03-20 21:18:37

0

,你可以聲明你的對象:

MyPets<Animal> obj; 

你把它叫做:

obj.myGenericMethod(Animal aimal); 
1

無論是從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

0

如果我正確理解你的問題,你需要修改,像這樣你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