Java lambda:预期的对象但找到了MyClass

时间:2018-05-12 12:39:33

标签: java object lambda superclass

如果我有:

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

我做了:

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

它的工作正常,我假设,因为每个类都有Object作为超类。

但是,如果我这样做:

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课程,因为我希望不仅能够收到SomeOtherClass,还能收到SomeOtherClassXPTO。 我试着查了一下,到目前为止没有发现任何东西,所以如果以前曾经问过我,我会提前道歉。

2 个答案:

答案 0 :(得分:3)

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

要使这种方法起作用,你会做类似Predicate<? extends Object>的事情,但这没有多大意义。然后单独使用Predicate<?>

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

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

答案 1 :(得分:1)

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

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>以获得灵活性。