调用泛型方法

Sac*_*n S 0 java

我执行下面提到的代码时遇到以下错误:

TestGenerics1.java:40: error: cannot find symbol
                              arr.get(i).eat();
                                        ^
symbol:   method eat()
location: class Object
1 error
Run Code Online (Sandbox Code Playgroud)

我将面临的问题在以下示例代码的帮助下重现:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我取消注释public static void takeAnimals(List<Cat> arr)并注释掉,public static void takeAnimals(List<? super RedCat> arr)那么它的效果很好.

为什么它不起作用public static void takeAnimals(List<? super RedCat> arr)

Mạn*_*yễn 5

List<? super RedCat>是一些超类型的列表RedCat.

编译器无法确定传递的类型,并且不eat()存在保证方法.

相反,你应该使用extends:

List<? extends Cat>
Run Code Online (Sandbox Code Playgroud)

  • 我认为它应该是`List <?扩展Animal>`因为`Animal`定义方法`eat()`. (2认同)