2012-07-12 144 views
0

我是新來的泛型。這是我的課程。如何從java中的方法返回泛型類型

public interface Animal {  
    void eat(); 
} 

public class Dog implements Animal {  
    public void eat() { 
     System.out.println("Dog eats biscuits");  
    }  
} 

public class Cat implements Animal {  
    public void eat() {  
     System.out.println("Cat drinks milk");  
    }  
} 

現在我想要這些類以通用的方式使用。

public class GenericExample { 

    public <T extends Animal> T method1() {  
     //I want to return anything that extends Animal from this method 
     //using generics, how can I do that  
    } 

    public <T extends Animal> T method2(T animal) {  
     //I want to return anything that extends Animal from this method 
     //using generics, how can I do that 
    } 

    public static void main(String[] args) {  
     Dog dog = method1(); //Returns a Dog  
     Cat cat = method2(new Cat()); //Returns a Cat  
    }  
} 

如何從方法「method1」和「method2」返回泛型類型(可能是Cat或Dog)。我有幾個這樣的方法返回「T extends Animal」,所以最好在方法級別或類級別聲明泛型類型。

+3

可能會幫助你http://stackoverflow.com/questions/450807/java-generics-how-do-i-make-the-method-return-type-generic – Habib 2012-07-12 05:47:46

回答

1

你不能有一個方法返回一個泛型類型,並希望能夠在沒有強制轉換的情況下在方法的調用者中訪問該類型,除非該類型可以從該方法的參數中推導出來。因此main中的示例將不起作用。

所以,你要麼去沒有泛型,並且或者把返回式手動

public Animal method1() 
    Dog dog = (Dog)method1() 

還是有方法返回子類類型開始。

public Dog method1() 
    Dog dog = method1() 

或者你可以使用泛型去,要麼指定類型調用方法

public <T extends Animal> T method1() 
    Dog dog = <Dog>method1() 

時,或通過一些參數從中型可以推斷(這第二種方法已經滿足):

public <T extends Animal> T method1(Class<T> classOfreturnedType) 
    Dog dog = method1(Dog.class) 

而且nituce,你只能調用method1static main如果static本身。

+0

非常感謝你。 – user1519735 2012-07-12 06:25:20

0

該方法1只是說它返回一個動物。返回動物的任何實例,並且代碼將編譯:

return new Dog(); 

第二種方法說,它返回一個動物,其是相同的類型比給定爲參數的動物。所以你可以返回參數本身,然後編譯。你已經說過哪種類型的方法必須返回,但是你沒有說明該方法必須做什麼並返回,所以不可能實現它。我只能說return animal;會編譯。