Java泛型推理太广泛了?
我有两门课:Java泛型推理太广泛了?,java,generics,recursion,lambda,type-inference,Java,Generics,Recursion,Lambda,Type Inference,我有两门课: class M { public <R, A, T extends A> A walk(BiFunction<Widget, Integer, Stream<R>> walker, BiFunction<A, Stream<R>, T> accF, A acc, int level) { return accF.apply(acc, walker.apply(this, level)); }
class M {
public <R, A, T extends A> A walk(BiFunction<Widget, Integer, Stream<R>> walker, BiFunction<A, Stream<R>, T> accF, A acc, int level) {
return accF.apply(acc, walker.apply(this, level));
}
}
M类{
公共A步行(双功能步行机、双功能accF、A acc、int级别){
返回accF.apply(acc,walker.apply(本级));
}
}
及
N类扩展了M类{
公共流getChildren(){return Stream.of(new M()…);}
@凌驾
公共T形步行道(双功能步行机、双功能accF、A acc、int级){
返回accF.apply(accF.apply(acc,walker.apply(this,level)),getChildren().map(o->o.walk(walker,accF,acc,level+1));
}
}
但是,编译器在o.walk(walker,accF,acc,level+1)
上说推理变量T有不兼容的边界:相等约束:T上界:A,Object,RR
为什么会这样?我该如何解决这个问题?这是一段非常复杂的代码,我没有时间认真思考,但是因为
getChildren()
返回任何M
和N#walk
使用自己的通用定义。编译器知道,例如A
可以是不同的类型,具有不同的子对象边界和walk
您可以尝试将泛型定义放在类级别,例如
class M <R, A, T extends A> {
public A walk(...) { ... }
}
class N <RR, A, T extends A> extends M< RR, A, T> {
public Stream<M<RR, A, T>> getChildren() {...}
public A walk(...) { ... }
}
M类{
公共散步(…){…}
}
类N扩展了M{
公共流getChildren(){…}
公共散步(…){…}
}
这就是你如何让某一天变得悲惨的方式吗?@MuratK。呵呵:)嗯,也许看起来有点复杂。。但这只是一个递归树访问者。。至于这里的类型,这在Scala编程中非常常见。。不被认为是世界之外的东西。。idk for Java..除了quesiton中的实际错误之外,你能使它可编译吗?例如,什么是小部件
和..
?我不太熟悉这里的lambda语法,但是如果我没有弄错的话,map()
方法应该返回类型为Stream
的值,因为accF
就是这样定义的。但是,由于您还将accF
传递给o.walk()
,因此您试图返回一个不合适的T
类型的值。
class M <R, A, T extends A> {
public A walk(...) { ... }
}
class N <RR, A, T extends A> extends M< RR, A, T> {
public Stream<M<RR, A, T>> getChildren() {...}
public A walk(...) { ... }
}