Вы можете вызов любого метода на любом случае с помощью отражения, но вы не должны.
В вашем конкретном случае использования:
IMetric metric = new PerfGauge(name,source);
((IPrintable)metric).print();
вы можете просто бросить в PerfGauge
:
IMetric metric = new PerfGauge(name,source);
((PerfGauge)metric).print();
... но это не очень приятно.
я вижу эти дополнительные опции неподготовленный:
Добавить print
в IMetric
, так как вы, кажется, это нужно, где у вас есть IMetric
ссылку на экземпляр.
Создайте второй независимый интерфейс, IPrintable
или что угодно, с print
; и имеют PerfGauge
реализовать это; затем используйте IPrintable
вместо IMetric
в вашем регионе использования.
Пример ниже.
Tie IPrintable
к IMetric
(public interface IPrintableMetric extends IMetric
) для создания IPrintableMetric
и использовать что в вашем месте использования:
IPrintableMetric metric = new PerfGauge(name,source);
metric.print();
Из ограничений вы упоминаете в комментарии по этому вопросу, это звучит как независимым IPrintable
может быть способ:
public interface IPrintable {
void print();
}
public class PerfGauge implements IMetric, IPrintable {
public PerfGauge(String name, final Object gaugeSource) {
}
public void print() {
System.out.println("Hello");
}
}
затем:
IPrintable metric = new PerfGauge(name,source);
metric.print();
или
IMetric metric = new PerfGauge(name,source);
((IPrintable)metric).print();
или если вы получаете в IMetric
без контекста, то:
if (metric instanceof IPrintable) {
((IPrintable)metric).print();
}
Почему бы не добавить '' print' в IMetric'? –
Если метод отсутствует в интерфейсе, его можно вызвать только путем преобразования переменной «метрика» в тип реализующего класса. – Eran
, единственный способ сделать это - либо включить метод 'print' в' IMetric' 'interface', либо с помощью оператора' instanceof', чтобы проверить, является ли 'метрика' экземпляром' PerfGauge', : '((PerfGauge) метрика) .print();'. Другое, поскольку интерфейс 'metric' не знает о методе' print'. – SomeJavaGuy