Java 为什么函数<;界面,R>;不接受子类的方法引用?

Java 为什么函数<;界面,R>;不接受子类的方法引用?,java,function,generics,Java,Function,Generics,假设我有一个接口Animal,方法是stringgetrace(),还有一个子类Dog。我在列表中保留了一些动物,但在该示例中,类之间没有任何关系。Dog::getRace需要Dog实例,但animals.stream()提供Animal实例 我想,既然Dog实现了Animal,并且getRace在Animal中声明,那么什么应该起作用呢 zoo.sort(Animal::getRace); Dog::getRace需要Dog实例,但animals.stream()提供Animal实例

假设我有一个接口
Animal
,方法是
stringgetrace()
,还有一个子类
Dog
。我在
列表中保留了一些动物,但在该示例中,类之间没有任何关系。

Dog::getRace
需要
Dog
实例,但
animals.stream()
提供
Animal
实例

我想,既然
Dog
实现了
Animal
,并且
getRace
Animal
中声明,那么什么应该起作用呢

    zoo.sort(Animal::getRace);

Dog::getRace
需要
Dog
实例,但
animals.stream()
提供
Animal
实例

我想,既然
Dog
实现了
Animal
,并且
getRace
Animal
中声明,那么什么应该起作用呢

    zoo.sort(Animal::getRace);
这项工作:

public static void main (String[] args) {
    Zoo zoo = new Zoo();
    zoo.sort(Animal::getRace);
}
原因很简单:

要使用
Comperator
动物的列表进行排序,它必须是
Comperator
。这意味着您传递给Comperator的函数。比较需要 具有
功能此功能:

public static void main (String[] args) {
    Zoo zoo = new Zoo();
    zoo.sort(Animal::getRace);
}
原因很简单:

要使用
Comperator
动物的列表进行排序,它必须是
Comperator
。这意味着您传递给Comperator的函数。比较需要
具有
功能,因为
列表
是if
动物
类型,而不是
type@Deadpool对,我有点期待这样的事情。我很困惑,因为
能做
动物
能做的一切。简言之:不是每个
动物
都是
。因为
列表
是if
动物
类型,而不是
type@Deadpool对,我有点期待这样的事情。我很困惑,因为
能做
动物
能做的一切。简言之:不是每只
动物
都是
。对,这是有道理的。我以前没有真正使用过方法引用,这就是我感到困惑的原因。@shread它更多的是泛型的问题。Java中的泛型类型(包括泛型接口)仅由编译器强制执行。所有类型信息都会在运行时被擦除——如果你想用谷歌搜索它,这称为“类型擦除”。这意味着您只能使用编译可以确保的泛型,这就是为什么您不能在此处使用
Dog
函数代替
Animal
函数的原因。编译器无法确保在运行时,方法签名仍然与
Animal
中的签名兼容。对,这是有意义的。我以前没有真正使用过方法引用,这就是我感到困惑的原因。@shread它更多的是泛型的问题。Java中的泛型类型(包括泛型接口)仅由编译器强制执行。所有类型信息都会在运行时被擦除——如果你想用谷歌搜索它,这称为“类型擦除”。这意味着您只能使用编译可以确保的泛型,这就是为什么您不能在此处使用
Dog
函数代替
Animal
函数的原因。编译器无法确保在运行时,方法签名仍然与
Animal
中的签名兼容。