Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型推理太广泛了?_Java_Generics_Recursion_Lambda_Type Inference - Fatal编程技术网

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(...) { ... }
}