Java lambda:预期对象但找到 MyClass

bla*_*her 5 java lambda object superclass

如果我有:

public class MyClass{
    MyClass(Object b){
        //Some code here
    }
}
Run Code Online (Sandbox Code Playgroud)

我这样做:

MyClass X = new MyClass(new SomeOtherClass());
Run Code Online (Sandbox Code Playgroud)

我假设它工作得很好,因为每个类都有 Object 作为超类。

但是,如果我这样做:

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

进而:

MyClass X = new MyClass((SomeOtherClass s) -> {
    //Even more code
    return true;
});
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息:

Incompatible parameter types in lambda expression: expected Object but found SomeOtherClass
Run Code Online (Sandbox Code Playgroud)

我不应该能够SomeOtherClass在该 lambda 表达式中发送对象吗?我使用该Object课程是因为我不仅希望能够收到SomeOtherClass,还希望能够收到SomeOtherClassXPTO。我尝试查找此问题,但到目前为止什么也没发现,所以如果之前有人问过这个问题,我提前表示歉意。

Yas*_*jaj 3

好吧,当您定义谓词时,Predicate<Object>它仅限于仅接受getClass()方法返回的对象Object

要使这种方法发挥作用,您将执行类似的操作Predicate<? extends Object>,但这没有多大意义。Predicate<?>那就单独使用吧。

否则,解决此问题的另一种方法是找到两个类(可能是父类)的共同点并使用Predicate<? extends ParentClass>.

最终的解决方案是根据您的应用程序逻辑创建一个接口,并由两个对象实现该接口,以便能够执行以下操作Predicate<? extends YourInterface>