2016-06-06 6 views
1

У меня есть 2 классов:Java-общий вывод слишком широк?

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 N extends M { 

    public Stream<M> getChildren() {return Stream.of(new M()...);} 

    @Override 
    public <RR, A, T extends A> T walk(BiFunction<Widget, Integer, Stream<RR>> walker, BiFunction<A, Stream<RR>, T> accF, A acc, int level) { 
     return 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) что inference variable T has incompatible bounds: equality constraints: T upper bounds: A, Object, RR

Почему так и как это исправить?

+8

Это ваш путь к тому, как сделать кому-то день несчастным? –

+0

@MuratK. heheh :) ну, может быть, это выглядит немного сложным ... но это всего лишь рекурсивный посетитель дерева .. и что касается типа здесь, это довольно обычное явление в программировании Scala .. не воспринимается как нечто вне мира. idk для Java хотя .. – noncom

+0

Можете ли вы сделать его компилируемым ** кроме ** для фактической ошибки в quesiton? То есть что такое «Виджет» и «...»? – Marco13

ответ

1

Это очень сложный код, и у меня нет времени, чтобы действительно подумать об этом, но так как 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(...) { ... } 
} 
Смежные вопросы