当我执行下面提到的代码时,出现以下错误:
TestGenerics1.java:40: error: cannot find symbol
arr.get(i).eat();
^
symbol: method eat()
location: class Object
1 error
我面临的问题是在以下示例代码的帮助下重现的:
import java.util.*;
abstract class Animal
{
void eat() { System.out.println("animal eating"); }
}
class Dog extends Animal
{
void bark() { }
}
class Cat extends Animal
{
void meow() { }
}
class RedCat extends Cat { }
public class TestGenerics1
{
public static void main(String[] args)
{
new TestGenerics1().go();
}
public void go()
{
List<Cat> arrAnimals = new ArrayList<Cat>(Arrays.asList(new RedCat(), new Cat()));
takeAnimals(arrAnimals);
}
//public static void takeAnimals(List<Cat> arr)
public static void takeAnimals(List<? super RedCat> arr)
{
for(int i=0; i<arr.size(); i++)
{
arr.get(i).eat();
}
}
}
如果我取消注释 public static void takeAnimals(List<Cat> arr)
并注释掉public static void takeAnimals(List<? super RedCat> arr)
然后就可以正常工作了。
为什么它不适用于 public static void takeAnimals(List<? super RedCat> arr)
?
最佳答案
List<? super RedCat>
是一些类型的列表,这些类型是 RedCat
的父类(super class)型。
编译器无法确定传递的是哪种类型,并且不能保证 eat()
方法已存在。
相反,您应该使用 extends
:
List<? extends Cat>
关于java - 调用泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50666505/