Представьте себе универсальный класс MySet, который поддерживает родительский экземпляр MySet и дочерний экземпляр MySet. Идея состоит в том, что родитель должен иметь возможность хранить надмножество T, а потомок - подмножество. Итак, учитывая следующий пример, рассмотрим следующую проблему:
class MySet<T> {
MySet<? extends T> child;
void doStuff (Collection<? extends T> args) {
child.doStuff(this, args);
}
}
РЕДАКТИРОВАТЬ: фиксированный вопрос и пример кода для отражения реальной проблемы
Теперь дочерний шаблон <T
> может быть более строгим, чем родительский <T
>, поэтому родитель должен передать в Collection <X
>, где <X
> соответствует дочернему <T
>. Имейте в виду, что эта цепочка parent-> child может быть произвольно длинной. Есть ли способ упорядочить дженерики так, чтобы parent.doStuff (...) скомпилировался, т. Е. Чтобы его можно было вызывать только с аргументами самого строгого потомка?
Это будет означать, что компилятор java будет передавать общую информацию по всей цепочке parent-> child, чтобы определить допустимые аргументы для doStuff, и я не знаю, есть ли у него такая возможность.
Это единственное решение, гарантирующее, что дети не могут быть более строгими, чем их родители, использующие дженерики (т. Е. MySet <T
> child; вместо MySet <? extends T
>) и позволяющие детям быть более строгими, чем их родители в других местах кода.