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>
以获得灵活性。
如果我有:
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>
以获得灵活性。