Использование "супер" с "?" на Яве
Я пытаюсь прочитать и понять некоторый код Java. Вот:
protected LoadTarget<? super PopulationLoadContext> createTarget(PopulationLoadContext context) {
return createTransactionalTargetGroup(RiskScoresTables.All_Tables);
}
Что это <? super PopulationLoadContext>
имею в виду?
3 ответа
В Java это подстановочный знак с ограничением снизу в дженериках, который обозначает PopulationLoadContext
или любой суперкласс этого класса.
Это может быть LoadTarget<PopulationLoadContext>
или это может быть LoadTarget<Object>
или что-нибудь промежуточное (если между классами существуют).
В более общем смысле (не только на языке Java), если вы хотите получить более широкую картину, это также называется ковариацией / контравариантностью: http://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29 см. Раздел Java:
"дали List<? extends Foo>
, тогда элемент может быть извлечен и безопасно назначен Foo
тип (ковариация). Учитывая List<? super Foo>
, затем Foo
объект может быть безопасно добавлен как элемент (контрвариантность)."
Что это?
Как утверждает rgettman, это универсальный тип LoadTarget
с аргументом типа, установленным в ограниченный снизу символ подстановки.
Что это позволяет?
Во время выполнения LoadTarget
переменная может быть заменена (установлена) значением того же типа, где аргумент типа PopulationLoadContext
или предок.
Зачем?
Для обеспечения гибкости - семейство различных экземпляров типов может заменять друг друга и работать нормально. В LoadTarget
параметр типа используется для параметров метода (входных данных) или для верхних границ типов внутренних экземпляров универсальных типов. В этих случаях более широкий тип заменяется исходным типом, потому что он более приспособлен. Говорят, что универсальный тип имеет противоречивость с параметром типа