import java.util.Optional;
import java.util.function.Consumer;
class test<T> {
public void foo(Consumer<Optional<T>> c) {
Optional<T> t = null;
c.accept(t); // compiles
}
public void foo2(Consumer<? super Optional<?>> c) {
Optional<T> t = null;
//c.accept(t); // doesn't compile
}
public static <T, S extends T> void foo3(Consumer<Optional<T>> c, test<S> test) {
Optional<S> s = null;
@SuppressWarnings("unchecked") // Safe because of properties of Optional.
Optional<T> t = (Optional<T>) (Optional<?>) s;
c.accept(t);
}
public static void main
(String[] args
) { test<Integer> t = new test<>();
Consumer<Optional<Number>> crn = c -> {};
Consumer<Optional<Integer>> cri = c -> {};
foo3(cri, t); // compiles
foo3(crn, t); // compiles
}
}
aW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKCmNsYXNzIHRlc3Q8VD4gewoKICAgIHB1YmxpYyB2b2lkIGZvbyhDb25zdW1lcjxPcHRpb25hbDxUPj4gYykgewogICAgICAgIE9wdGlvbmFsPFQ+IHQgPSBudWxsOwogICAgICAgIGMuYWNjZXB0KHQpOyAvLyBjb21waWxlcwogICAgfQoKICAgIHB1YmxpYyB2b2lkIGZvbzIoQ29uc3VtZXI8PyBzdXBlciBPcHRpb25hbDw/Pj4gYykgewogICAgICAgIE9wdGlvbmFsPFQ+IHQgPSBudWxsOwogICAgICAgIC8vYy5hY2NlcHQodCk7IC8vIGRvZXNuJ3QgY29tcGlsZQogICAgfQogICAgCiAgICBwdWJsaWMgc3RhdGljIDxULCBTIGV4dGVuZHMgVD4gdm9pZCBmb28zKENvbnN1bWVyPE9wdGlvbmFsPFQ+PiBjLCB0ZXN0PFM+IHRlc3QpIHsKICAgIAlPcHRpb25hbDxTPiBzID0gbnVsbDsKICAgIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgIC8vIFNhZmUgYmVjYXVzZSBvZiBwcm9wZXJ0aWVzIG9mIE9wdGlvbmFsLgogICAgCU9wdGlvbmFsPFQ+IHQgPSAoT3B0aW9uYWw8VD4pIChPcHRpb25hbDw/PikgczsKICAgIAljLmFjY2VwdCh0KTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgdGVzdDxJbnRlZ2VyPiB0ID0gbmV3IHRlc3Q8PigpOwogICAgICAgIENvbnN1bWVyPE9wdGlvbmFsPE51bWJlcj4+IGNybiA9IGMgLT4ge307CiAgICAgICAgQ29uc3VtZXI8T3B0aW9uYWw8SW50ZWdlcj4+IGNyaSA9IGMgLT4ge307CgogICAgICAgIGZvbzMoY3JpLCB0KTsgLy8gY29tcGlsZXMKICAgICAgICBmb28zKGNybiwgdCk7IC8vIGNvbXBpbGVzCiAgICB9Cn0=