Использование "супер" с "?" на Яве

Я пытаюсь прочитать и понять некоторый код 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параметр типа используется для параметров метода (входных данных) или для верхних границ типов внутренних экземпляров универсальных типов. В этих случаях более широкий тип заменяется исходным типом, потому что он более приспособлен. Говорят, что универсальный тип имеет противоречивость с параметром типа

Другие вопросы по тегам