Java 8函数-不兼容类型

Java 8函数-不兼容类型,java,java-8,Java,Java 8,我试图将一个java 8函数指针分配给一个变量,但在构建时出现了一个不兼容的类型错误。编译器似乎没有考虑“”扩展BaseEntity“ 对于以下代码,ChildEntity直接扩展BaseEntity: private int getValue(ChildEntity entity) { return 0; } Function<? extends BaseEntity, ?> function = this::getValue; private int getValue

我试图将一个java 8函数指针分配给一个变量,但在构建时出现了一个不兼容的类型错误。编译器似乎没有考虑“”扩展BaseEntity“

对于以下代码,ChildEntity直接扩展BaseEntity:

private int getValue(ChildEntity entity) {
    return 0;
}

Function<? extends BaseEntity, ?> function = this::getValue;
private int getValue(ChildEntity){
返回0;
}
Function=this::getValue;

错误:无法将基本实体转换为ChildEntity。

ChildEntity扩展了BaseEntity,因此扩展BaseEntity的所有内容都不是函数的有效参数。你可以做:

Function<ChildEntity, int> function = this::getValue;
Function=this::getValue;


Function思考如何使用
Function
。您将向其中传递从
BaseEntity
继承的任何类型的对象

想象一下,
spooseentity
也直接从
BaseEntity
派生而来。您能否将该
配偶实体
传递到需要
子实体
的方法中

不,您不会,因为
spooseentity
不是从
ChildEntity
派生的

换言之,函数指针指向的方法的参数的派生形式不得超过函数指针本身声明的参数。函数指针参数必须派生自它指向的方法中声明的参数,或与之相同


(请注意,返回类型的工作方式正好相反,这就是为什么存在
super
,因为方法的返回类型必须继承其函数指针的返回类型或与之相同)。

?super BaseEntity
将不起作用,因为
BaseEntity
不扩展
ChildEntity
(事实上情况正好相反)


?extends BaseEntity
将不起作用,因为我们不知道函数将接受哪种类型的
BaseEntity
。作为调用者,我不知道传递
ChildEntity
BaseEntity
somethertypeofentity
或其他任何东西是否安全。

请记住
此关键字适用于您当前工作的类。因此,除非BaseEntity有方法
getValue(ChildEntity)
否则任何扩展BaseEntity的方法都可能无法工作。将函数更改为需要扩展ChildEntity的类。您还缺少返回类型

请你再表演一点好吗?我不同意第一句话。“super”是指传递BaseEntity的任何超类,而不是从中继承的任何类型。@Maaatt-我的答案或问题tbh中没有提到“super”。“想想函数将如何使用。您将向其中传递从BaseEntity继承的任何类型的对象。”在后期编辑之前,前面提到的函数意味着该函数本身需要BaseEntity的超类实例或BaseEntity@Maaaatt-出于同样的原因,这是行不通的。函数指针仅与方法兼容,前提是指针指定的参数至少与所指向的方法上声明的参数一样派生。但我明白你的观点(现在由编辑提出),如果我没有投票权的话,我会投赞成票。我同意这一点。我的观点是,他的问题可能更多地与getValue的定义有关,而不是与函数声明有关。
Function<? extends ChildEntity, int> function = this::getValue;