Возврат универсального объекта из функции

Я пишу функцию для добавления метрик в наш сервис и хочу сделать ее универсальной, чтобы ее можно было использовать для разных типов метрик. Я не хочу делать какие-то странные приведения, поэтому я подумал просто сделать функцию универсальной, например:

public <T extends Metric> T addMetric(String key,
        Function<MetricRegistry, T> metricProducer) {
    MetricRegistry registry = SharedMetricRegistries.tryGetDefault();

    Metric m = metricProducer.apply(registry);
    registry.register(key, m);

    return m;
}

Однако это не сработает из-за «несовместимых типов», которые я нахожу довольно странными. В нем говорится, что требуется T, но найдено Metric при возврате, но разве T уже не определено как Metric в соответствии с параметром типа?

изменить Metric m = metricProducer.apply(registry); на T m = metricProducer.apply(registry);

Eran 08.04.2019 14:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Изменять

public <T extends Metric> T addMetric(String key,
        Function<MetricRegistry, T> metricProducer)

К

public <T extends Metric> Metric addMetric(String key,Function<MetricRegistry, T> metricProducer)

Или изменить

Metric m = metricProducer.apply(registry);

К

T m = metricProducer.apply(registry);

Оба будут работать.

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