java - 调用泛型方法

标签 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)

最佳答案

List<? super RedCat>是一些类型的列表,这些类型是 RedCat 的父类(super class)型。

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

相反,您应该使用 extends :

List<? extends Cat>

关于java - 调用泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50666505/

相关文章:

java - Android 二进制布局膨胀异常 : ClassNotFoundException: Didn't find class "android.view.layout" on path:

java - 项目中的第二个 servlet 不工作

java - Ubuntu 32位下编译LuaJava

java - Spring Boot 1.4.1 和 Cassandra 3.x

java - spring中model和modelandview的区别

java - 将音乐淡入新轨道?

java - 在单行中分配和执行 if/else 条件

java - 将 byte[] 转换为自定义 java 对象

Java比较无序的ArrayLists

java - Java 中的 RandomAccessFile vs Scanner vs FileInputStream