Я пишу функцию для добавления метрик в наш сервис и хочу сделать ее универсальной, чтобы ее можно было использовать для разных типов метрик. Я не хочу делать какие-то странные приведения, поэтому я подумал просто сделать функцию универсальной, например:
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
в соответствии с параметром типа?
Изменять
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);
Оба будут работать.
изменить
Metric m = metricProducer.apply(registry);
наT m = metricProducer.apply(registry);