Java 与lambda和函数接口一起使用时理解下界的问题

Java 与lambda和函数接口一起使用时理解下界的问题,java,generics,lambda,java-8,predicate,Java,Generics,Lambda,Java 8,Predicate,在研究Java8流时,我遇到了以下代码片段: Predicate<? super String> predicate = s -> s.startsWith("g"); 谓词Lambda参数类型是精确的,不能是?超级还是?扩展。这一点已被包括在内。它介绍了地面目标类型的概念(基本上是lambda类型)。除其他事项外,还规定: 如果T是一个通配符参数化的函数接口类型,并且lambda表达式是隐式类型的,则地面目标类型是T的非通配符参数化() 我的。所以当你写作的时候 Predi

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

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

谓词Lambda参数类型是精确的,不能是
?超级
还是
?扩展
。这一点已被包括在内。它介绍了地面目标类型的概念(基本上是lambda类型)。除其他事项外,还规定:

如果
T
是一个通配符参数化的函数接口类型,并且lambda表达式是隐式类型的,则地面目标类型是T的非通配符参数化()

我的。所以当你写作的时候

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

Predicate我刚刚测试了它,赋值本身编译。更改的是您是否可以实际调用
predicate.test()

让我们退一步,使用占位符
GenericClass
进行解释。对于类型参数,
Foo
扩展
Bar
Bar
扩展
Baz

扩展:
当您声明一个
泛型类
扩展
也编译--
谓词
谓词时,我为没有给出完整的代码而道歉。未编译的实际代码是行boolean test=anyMatch(谓词);那是后来发生的。实际的谓词行本身以上界和下界语法进行编译。经过一段时间的逻辑思考,我明白了为什么anyMatch会有这样的签名。谢谢你的澄清。有界参数的Lambda默认行为是我困惑的核心。感谢您的见解。返回类型/参数摘要使得理解它们的用法更加容易。
Predicate<? super String> predicate = s -> s.startsWith("g");
Predicate<? super String> predicate = (Predicate<String>)(s -> s.startsWith("g"));
Predicate<String> pred = (Predicate<String>)(s -> s.startsWith("g"));
Predicate<? super String> predicate = pred;