Расширение универсального Java-класса не распознает супер-конструктор - PullRequest
0 голосов
/ 26 февраля 2019

Может кто-нибудь помочь мне понять, почему этот код Java не компилируется?

Идея состоит в том, что A - это древовидный класс для типа T, который принимает коллекцию дочерних элементов вконструкция.

Затем я определяю расширение B из A, которое специализируется T для Pair<R,R>.

class A<T> {
    A(T t, Collection<? extends A<? extends T>> cOfAs) {

    }
}

class B<R> extends A<Pair<R,R>> { // Pair is just a POJO class
    B(Pair<R,R> pair, Collection<? extends B<? extends R>> cOfBs) {
        super(pair, cOfBs);
        // ERROR: The constructor A<Pair<R,R>>(Pair<R,R>, Collection<capture#1-of ? extends B<? extends R>>) is undefined
    }
}

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Тип второго параметра не совпадает.Конструктор B принимает Collection<? extends B<? extends R>>, но конструктор суперкласса принимает Collection<? extends A<? extends T>>.

Вы определили T как Pair<R, R> в своем классе B, поэтому вместо R, используйте Pair<R, R>.Также должна совпадать часть ? extends, поэтому измените ? extends B<...> на ? extends A<...>.Сигнатура конструктора B теперь выглядит следующим образом:

B(Pair<R,R> pair, Collection<? extends A<? extends Pair<R, R>>> cOfBs)

Это должно быть точно ? extends A, поскольку ? extends B может не совпадать с ? extends A.Единственный способ сопоставить это - ввести другой параметр типа в A, представляющий тип «self», и использовать его во втором параметре конструктора.

class A<T, S extends A<T, S>> {
    A(T t, Collection<? extends S> cOfAs) {

    }
}

Затем в B, поставьте B<R> как "я".

class B<R> extends A<Pair<R,R>, B<R>> { // Pair is just a POJO class
    B(Pair<R,R> pair, Collection<? extends B<R>> cOfBs) {
        super(pair, cOfBs);
    }
}
0 голосов
/ 26 февраля 2019

Тип второго аргумента конструктора неправильный:

Error:(20, 25) java: incompatible types: java.util.Collection<capture#1 of ? extends Main.B<? extends R>> cannot be converted to java.util.Collection<? extends Main.A<? extends javafx.util.Pair<R,R>>>

Чтобы исправить это, измените второй аргумент на Collection<? extends B<R>> cOfBs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...