我正在努力解决这个问题,并且想知道是否有人可以解释原因.
我有三个班:员工,人和天使.
员工延伸人和人延伸天使.
当我尝试执行此代码时
class Angel {}
class Person extends Angel {}
class Employee extends Person {}
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
在类型List中添加(捕获#5-of?super Person)的方法不适用于参数(Angel)
我一直在阅读文档<? super X >意味着任何类型的X或X的超类(所以在我的情况下,Angel是Person的超类)并且应该被允许?显然不是!
有没有人有任何简单的例子?
在研究Java8 Streams时,我遇到了以下代码片段:
Predicate<? super String> predicate = s -> s.startsWith("g");
Run Code Online (Sandbox Code Playgroud)
由于泛型参数是下限,我认为这不会编译.我看到它的方式,如果一个Object是String的超类型,那么传入一个Object类型应该会破坏它,因为Object没有startsWith()函数.但是,我很惊讶地看到它没有任何问题.
更进一步,当我调整谓词采取上限:
<? extends String>,
Run Code Online (Sandbox Code Playgroud)
它不会编译.
我以为我理解了上限和下限的含义,但显然,我错过了一些东西.任何人都可以帮助解释为什么下限与这个lambda一起工作?