Java lambda:需要对象但找到了 MyClass

Java lambda: Expected Object but found MyClass

如果我有:

public class MyClass{
    MyClass(Object b){
        //Some code here
    }
}

我也是:

MyClass X = new MyClass(new SomeOtherClass());

它工作得很好,我假设,因为每个 class 都有对象作为超级class。

但是,如果我这样做:

import java.util.function.Predicate;
public class MyClass{
    MyClass(Predicate<Object> b){
        //Some more code here
    }
}

然后:

MyClass X = new MyClass((SomeOtherClass s) -> {
    //Even more code
    return true;
});

我收到一条错误消息:

Incompatible parameter types in lambda expression: expected Object but found SomeOtherClass

我不能在那个 lambda 表达式中发送一个 SomeOtherClass 对象吗? 我正在使用 Object class,因为我不仅希望能够接收 SomeOtherClass,还希望能够接收 SomeOtherClassXPTO。 我尝试查找此内容,但到目前为止一无所获,所以如果之前有人问过这个问题,我提前致歉。

Inheritance does not work for Generic parameter,官方文档可以找到here


你需要

MyClass(Predicate<? extends Object> b) {
    //Some more code here
}

MyClass(Predicate<?> b) {
    //Some more code here
}

好吧,当您将谓词定义为 Predicate<Object> 时,它仅限于接受 objects 哪个 getClass() 方法 returns Object.

要使此方法起作用,您需要执行 Predicate<? extends Object> 之类的操作,但这没有多大意义。那就单独使用Predicate<?>

否则,解决此问题的另一种方法是找到两个 class 的公分母,可能是 parent class 并使用 Predicate<? extends ParentClass>.

最终的解决方案是根据您的应用程序逻辑创建一个接口,并通过 objects 实现该接口,以便能够像下面这样 Predicate<? extends YourInterface>

如您所知,以下内容有效:

Object o = new SomeOtherClass();

但是,这不适用于泛型,因为 generics are not covariant:

Predicate<Object> p;

p = (SomeOtherClass s) -> false; // compiler error - incompatible parameter types...

唯一可能分配给 Predicate<Object> 的是:

Predicate<Object> p = object -> ... ;

同时,这个谓词的输入可以是任何类型:

p.test(new Object());
p.test("");
p.test(99);

如 Yassin 的回答所述,考虑 Predicate<? extends Type> 以获得灵活性。