在java中使用类型转换和泛型

Pav*_*van 1 java generics

我有以下这个界面:

    public interface FruitDetails {
            public String getFruitName(); 
    }
Run Code Online (Sandbox Code Playgroud)

几个实现上述接口的类:

    public class Banana implements FruitDetails{

        private int index;
            public Banana(int i) {
                index = i;
        }

        @Override
        public String getFruitName() {
            return "Banana Fruit " + index;
        }

    }
Run Code Online (Sandbox Code Playgroud)

    public class Apple implements FruitDetails{

        private int index;
            public Apple(int i) {
                index = i;
        }

        @Override
        public String getFruitName() {
            return "AppleFruit " + index;
        }

    }
Run Code Online (Sandbox Code Playgroud)

我有一个打印水果细节的功能:

    static void getFruitDetails(List<FruitDetails> fruits) {
            for (FruitDetails fruitDetails : fruits) {
                    System.out.println(fruitDetails.getFruitName());
            }
    }
Run Code Online (Sandbox Code Playgroud)

现在我将创建一个香蕉列表:

  List<Banana> bananaList = new ArrayList<Banana>();
  bananaList.add(new Banana(0));
  bananaList.add(new Banana(1));
Run Code Online (Sandbox Code Playgroud)

现在我想使用getFruitDetails打印上面列表中的香蕉细节.

问题是如果试着打电话

  getFruitDetails(bananaList);
Run Code Online (Sandbox Code Playgroud)

我收到编译时错误:

The method getFruitDetails(List<FruitDetails>) in the type MainClass is not applicable for the arguments (List<Banana>)
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题.

并且还需要定义getFruitDetails,以便我能够打印香蕉列表或苹果列表的详细信息

x4u*_*x4u 5

要接受所有实现的FruitDetails类作为getFruitDetails的参数,您需要使用以下类型List<? extends FruitDetails>:

static void getFruitDetails(List<? extends FruitDetails> fruits) {
        for (FruitDetails fruitDetails : fruits) {
                System.out.println(fruitDetails.getFruitName());
        }
}
Run Code Online (Sandbox Code Playgroud)

作为一个副作用,这使得列表fruitsgetFruitDetails有效之所以说只读JB Nizet描述中的注释.