我有以下这个界面:
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,以便我能够打印香蕉列表或苹果列表的详细信息
要接受所有实现的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)
作为一个副作用,这使得列表fruits中getFruitDetails有效之所以说只读JB Nizet描述中的注释.