【发布时间】:2017-12-04 03:02:07
【问题描述】:
在以下示例中,我可以将Consumer<Optional<Integer> 传递给foo,但不能传递Consumer<Optional<Number>>。另一方面,我可以将任一类型传递给foo2,但是我不能从方法体中调用消费者的accept 方法。有没有办法改变foo 方法以使其有效?我最初的直觉是尝试void foo(Consumer<Result<? super T>> c),但这显然并不意味着我会假设。
import java.util.Optional;
import java.util.function.Consumer;
public class test<T> {
public void foo(Consumer<Optional<T>> c) {
Optional<T> t = null;
c.accept(t); // compiles
}
public void foo2(Consumer<? extends Optional<? super T>> c) {
Optional<T> t = null;
c.accept(t); // doesn't compile
}
public static void bar() {
test<Integer> t = null;
Consumer<Optional<Number>> crn = null;
Consumer<Optional<Integer>> cri = null;
t.foo(cri); // compiles
t.foo(crn); // doesn't compile
t.foo2(cri); // compiles
t.foo2(crn); // compiles
}
}
【问题讨论】:
标签: java generics generic-variance