[英]Passing lambda as parameter with generic type - java 8
如果我有一个方法foo(Predicate bar)
,则可以在下一个使用它:
foo(new Predicate<MyObject>() {
public boolean apply(MyObject obj) {
return true;
}
}
)
但是如何使用lambda样式的表达式达到相同的结果:
foo((MyObject obj) -> true); //obvious compile exception
如何将带有lambda的泛型类型传递给方法? 或者,简单地讲,如何使用不带局部变量的lambda样式创建Predicate(或其他)类的匿名对象。
不要使用原始类型foo(Predicate<? extends MyObject> bar)
或在Lambda foo(obj -> ((MyObject) obj).myMethod())
如果您的目标类型是原始类型,例如在调用foo(Predicate bar)
,您就无法期望lambda表达式能够为您神奇地生成适当的类型。 它与匿名内部类一起使用,因为该声明具有显式类型( Predicate<MyObject> {}
),该类型可以通过不安全的操作传递给Predicate
。 但是lambda表达式没有类型。 它们被转换为目标类型,在您的调用中,目标类型为Predicate
。
如果要通过lambda表达式创建Predicate<MyObject>
,则需要Predicate<MyObject>
作为目标类型:
Predicate<MyObject> p = o -> /* note that o has the type MyObject */true;
foo(p);
要么
foo((Predicate<MyObject>)o -> /* here, o has the type MyObject as well*/true);
要么
void fooHelper(Predicate<MyObject> p) {
foo(p);
}
…
fooHelper(o -> /* here, o has again the type MyObject*/true);
当然,在所有这些情况下,您也可以编写(MyObject o) -> true
,但是此参数的显式声明对使用此lambda表达式创建的实例的类型没有影响。
请注意,第二个变体具有类型转换的形式结构,但是在运行时不会进行类型转换操作。 它仅用于指定lambda表达式的目标类型(类似于加宽用于在方法调用中选择特定重载的转换)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.