如果我有:
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
。
我试着查了一下,到目前为止没有发现任何东西,所以如果以前曾经问过我,我会提前道歉。
答案 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>
以获得灵活性。