【发布时间】:2020-05-05 06:03:34
【问题描述】:
假设我有一个接口Animal,方法是String getRace() 和一个子类Dog。我在List<Animal> 里养了一些动物。
现在,如果我想对该列表进行排序并将Function<Animal, String> 传递给方法以将其与Comparator.comparing(...) 一起使用,那将可以正常工作。但是,如果我从 Dog 引用一个函数作为参数传递,编译器会抛出以下错误:
Zoo.Dog 类型没有定义这里适用的 getRace(Zoo.Animal)。
即使它是 Animal 的子类并且确实定义了该函数。
代码如下:
import java.util.*;
import java.util.function.*;
import java.util.stream.*;
public class Zoo {
public interface Animal {
public String getRace();
}
public class Dog implements Animal {
public String getRace() {
return "Some race";
}
}
private List<Animal> animals = Arrays.asList(new Animal[] {});
public void sort(Function<Animal, String> function) {
animals = animals.stream().sorted(Comparator.comparing(function)).collect(Collectors.toList());
}
public static void main(String[] args) {
Zoo zoo = new Zoo();
// Error: "The type Zoo.Dog does not define getRace(Zoo.Animal) that is applicable here"
zoo.sort(Dog::getRace);
}
}
这是为什么呢?
我找到了this question,但在该示例中,这些类之间没有任何关系。
【问题讨论】:
-
因为
List是Animal类型而不是Dog类型 -
@Deadpool 是的,我有点期待这样的事情。我很困惑,因为
Dog可以做Animal可以做的所有事情。 -
简而言之:不是每个
Animal都是Dog。