我正在尝试将java 8函数指针分配给变量,但在构建时会出现不兼容的类型错误。似乎编译器不尊重“?extends BaseEntity”。
对于以下代码,ChildEntity直接扩展BaseEntity:
private int getValue(ChildEntity entity) {
return 0;
}
Function<? extends BaseEntity, ?> function = this::getValue;
错误:无法将基本实体转换为ChildEntity。
答案 0 :(得分:2)
考虑如何使用function
。您将传递一个继承自BaseEntity
。
想象一下SpouseEntity
也直接来自BaseEntity
。您是否可以将SpouseEntity
传递给需要ChildEntity
的方法?
不,你不会,因为SpouseEntity
并非来自ChildEntity
。
换句话说,函数指针指向的方法必须使其参数不再多于函数指针本身声明的参数。函数指针参数必须派生自或指向它所指向的方法中声明的参数。
(注意返回类型的工作方式完全相反,这就是super
存在的原因,因为方法的返回类型必须继承或与其函数指针的返回类型相同。)
答案 1 :(得分:1)
ChildEntity扩展了BaseEntity,因此扩展BaseEntity的所有不是函数的有效参数。你可以这样做:
Function<ChildEntity, int> function = this::getValue;
或
Function<? extends ChildEntity, int> function = this::getValue;
答案 2 :(得分:1)
? super BaseEntity
无效,因为BaseEntity
未延伸ChildEntity
(实际情况恰恰相反)。
? extends BaseEntity
无效,因为我们并不真正知道该功能会接受哪种类型的BaseEntity
。作为来电者,我不知道传递ChildEntity
,BaseEntity
,SomeOtherTypeOfEntity
或其他任何内容是否安全。
答案 3 :(得分:-2)
Remeber this
关键字适用于您当前正在使用的类。因此,除非BaseEntity具有方法getValue(ChildEntity)
,否则扩展BaseEntity的任何内容都可能无效。更改函数以要求扩展ChildEntity的类。您也错过了退货类型。