如何在java中从方法返回泛型类型

如何在java中从方法返回泛型类型,java,generics,Java,Generics,我不熟悉泛型。这是我的课 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 ea

我不熟悉泛型。这是我的课

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    
   }    
}
公共类泛型示例{
公共T方法1(){
//我想返回任何扩展此方法的内容
//使用泛型,我如何才能做到这一点
}
公共T方法2(T动物){
//我想返回任何扩展此方法的内容
//使用泛型,我如何才能做到这一点
}
公共静态void main(字符串[]args){
Dog Dog=method1();//返回一个Dog
Cat=method2(new Cat());//返回一个Cat
}    
}

如何从方法“method1”和“method2”返回泛型类型(可能是猫或狗)。我有几个这样的方法返回“T extensed Animal”,所以最好在方法级别或类级别声明泛型类型。

方法1只是说它返回一个Animal。返回Animal的任何实例,代码将编译:

return new Dog();

第二种方法说,它返回的动物类型与作为参数给出的动物类型相同。因此,您可以返回参数本身,并编译它。您已经说过该方法必须返回哪种类型,但是您没有说过该方法必须执行什么操作和返回什么,因此不可能实现它。我只能说,
返回动物将编译。

您不能让一个方法返回泛型类型,并且期望能够在方法的调用者中访问该类型而无需强制转换,除非该类型可以从该方法的参数中推断出来。因此,
main
中的示例不起作用

因此,要么不使用泛型,要么手动转换返回类型

public Animal method1()
    Dog dog = (Dog)method1()
或者让方法返回要开始的子类类型

public Dog method1()
    Dog dog = method1()
或者可以使用泛型,并在调用方法时指定类型

public <T extends Animal> T method1()
    Dog dog = <Dog>method1()
publictmethod1()
Dog Dog=method1()
或者传递一些参数,从中可以推断类型(第二个方法已经满足):

公共T方法1(返回类型的类)
Dog Dog=method1(Dog.class)
另外,如果
static
本身是
static
,则只能从
static main
调用
method1

这可能会对您有所帮助
public <T extends Animal> T method1(Class<T> classOfreturnedType)
    Dog dog = method1(Dog.class)