У меня есть класс, который имеет собственный ссылочный общий параметр и параметр, который имеет тот же суперкласс. Статическая функция имеет одинаковые границы как класс.Java-вложенный self referential generic
public class Bar<T extends Bar<T, C>, C extends Bar<C, ?>> {
Bar() {
foo((T) null);
foo((C) null);//compile error
}
static <S_T extends Bar<S_T, S_C>, S_C extends Bar<S_C, ?>> void foo(S_T t) {
}
}
Это сообщение выдаст следующую ошибку.
Bound Несоответствие: Общий метод Foo (S_T) типа Bar < T, C> не применимо для аргументов (C). Выведенный типа C не является допустимой замены для ограниченного параметра < S_T расширяет Бар < S_T, S_C >>
Я не могу понять, почему C
не может быть принят, чтобы foo()
поскольку C
является Bar<C,?>
и подстановочный знак - Bar
, потому что второй параметр в объявлении говорит, что он расширяет Bar.
Я знаю, что это, вероятно, плохая идея и создает код, который трудно понять, но я действительно хочу знать, почему это не компилируется.
возможно связано с моим вопросом http://stackoverflow.com/questions/9937422/a-bad-interaction-between-self-referential-types- и-bounded-wildcards –
@JudgeMental несколько похожа; но из того, что я собрал из вашего вопроса, это иерархия классов, которая не удалось скомпилировать, тогда как моя иерархия классов компилируется, но терпит неудачу при ограничении аргумента для этой функции. – dege