执行以下代码时出现以下错误:

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的超类型。

编译器无法确定传递了哪种类型,并且不能保证eat()方法存在。

相反,您应该使用extends

List<? extends Cat>

10-08 14:19