首先,IMO,由于绑定到方法本身而不是类,并且也是,因此当前签名应该可以正常工作。U
Optional
Optional
final
如果上述两个条件之一不成立,则可以应用更改。感谢您@MalteHartwig提供的链接。让我总结一下这个具体问题的答案。很明显,如果返回类型需要协变,则在 Java 8 中需要后一个签名(较长的签名)。这不仅仅是关于继承。 需要在 前面声明用户站点方差,即使 is 是 。我做了一个代码片段来演示它:? extends
Optional<? extends U>
Function
Optional
final
import java.util.function.Function;
class A {}
class B extends A {}
final public class Option<T> {
private T value;
public Option(T v) { value = v; }
<U> Option<? extends U> flatMap1(Function<? super T, Option<? extends U>> mapper) {
return mapper.apply(value);
}
<U> Option<? extends U> flatMap2(Function<? super T, ? extends Option<? extends U>> mapper) {
return mapper.apply(value);
}
void test() {
Option<A> oa = new Option<>(new A());
Function<A,Option<A>> faa = (A a) -> new Option<>(new A());
Function<A,Option<B>> fab = (A a) -> new Option<>(new B());
//oa.flatMap1(faa); DOES NOT COMPILE
oa.flatMap2(fab);
}
}
似乎由于 Java 只有用户站点方差声明,因此您可能需要一系列声明,这些声明从要声明方差的类型变量一直传播到(第 2 个)最外层。? extends