关于java:与lambda和Functional Interface一起使用时理解下界的问题

Problems understanding lower bounds when used with lambda and Functional Interface

在研究Java8流时,我遇到了以下代码片段:

1
Predicate<? super String> predicate = s -> s.startsWith("g");

因为泛型参数是一个下限,所以我认为这不会编译。在我看来,如果一个对象是字符串的父类型,那么传入一个对象类型应该会破坏它,因为对象没有startswith()函数。然而,我惊讶地看到它毫无问题地工作。

此外,当我调整谓词使其取上界时:

1
<? extends String>,

它不会编译。

我以为我理解了上界和下界的含义,但很明显,我遗漏了一些东西。有人能解释为什么下限与这个lambda一起工作吗?