调用泛型方法

时间:2018-06-03 12:37:15

标签: java

执行下面提到的代码时出现以下错误:

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)

1 个答案:

答案 0 :(得分:5)

SELECT c.company AS 'company_name', (SELECT data FROM LOGIN WHERE FKcompanyTable = c.id ORDER BY id DESC LIMIT 1 ) as 'last_login' FROM COMPANY c 是某些类型的列表,这些类型是List<? super RedCat>的超类型。

编译器无法确定传递的类型,并且不保证RedCat方法存在。

相反,您应该使用eat()

extends