Java 8函数 - 不兼容的类型

时间:2017-08-04 21:17:21

标签: java java-8

我正在尝试将java 8函数指针分配给变量,但在构建时会出现不兼容的类型错误。似乎编译器不尊重“?extends BaseEntity”。

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

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

Function<? extends BaseEntity, ?> function = this::getValue;

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

4 个答案:

答案 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。作为来电者,我不知道传递ChildEntityBaseEntitySomeOtherTypeOfEntity或其他任何内容是否安全。

答案 3 :(得分:-2)

Remeber this关键字适用于您当前正在使用的类。因此,除非BaseEntity具有方法getValue(ChildEntity),否则扩展BaseEntity的任何内容都可能无效。更改函数以要求扩展ChildEntity的类。您也错过了退货类型。