如果您不匹配函数的类型和从中生成函数的对象,您将看到非静态错误。例如,这行代码不会编译,因为函数需要 Foo 作为它所作用的类型,但该函数是针对 Foobar 的:
Function<Foo, Bar> func = Foobar::getBar;
它不仅处理它在 for 循环或任何其他参数中的时间,也不必处理“范围内的内容”。这是 java 在使用新函数对象时错误标记的类型不匹配错误。将此与构造其他泛型时发生的情况进行比较:
List<Foo> list = new ArrayList<Bar>();
该行代码将无法编译并出现错误“不兼容的类型”。更好的是,尽管也以几乎完全相同的方式处理功能对象,但此代码也会因不兼容的类型而失败:
public void test() {
Function<Foo, Double> test2 = Foo::getDouble;
//fails with Incompatible types
test3(test2);
}
public void test3(Function<Foobar, Double> function) {
//who cares
}
我最好的建议是,当您开始遇到此错误时,将函数声明拉到新行,您应该能够看到实际问题是什么。为什么java选择“不能从静态上下文引用非静态方法”超出了我的理解。