0

我是泛型新手。这是我的课。

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”,所以在方法级别或类级别声明泛型类型更好。

4

2 回答 2

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)

如果它是它本身method1,你也只能调用它。static mainstatic

于 2012-07-12T06:14:25.313 回答
0

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

return new Dog();

第二种方法说它返回一个与作为参数给出的动物类型相同的动物。所以你可以返回参数本身,它会编译。你说了方法必须返回哪种类型,但是你没有说方法必须做什么和返回,所以不可能实现它。我只能说那return animal;会编译。

于 2012-07-12T05:58:20.663 回答