2016-08-10 4 views
-1

У меня есть интерфейс, который не имеет каких-либо методов.Вызов метода в классе, которого нет в интерфейсе, используя ограничения типов

public interface IMetric { 
} 

У меня есть его реализация следующим образом.

public class PerfGauge implements IMetric { 

    public PerfGauge(String name, final Object gaugeSource) { 

    } 
    print() { 
     System.out.println("Hello"); 
    } 
} 

Как я могу назвать метод в классе PerfGauge, имеющем IMetric как его тип? Я считаю, что это можно сделать через границы типов? Если да, то может кто-нибудь помочь с примером?

То, что я хочу сделать это,

IMetric metric = new PerfGauge(name,source); 
metric.print(); 
+0

Почему бы не добавить '' print' в IMetric'? –

+1

Если метод отсутствует в интерфейсе, его можно вызвать только путем преобразования переменной «метрика» в тип реализующего класса. – Eran

+0

, единственный способ сделать это - либо включить метод 'print' в' IMetric' 'interface', либо с помощью оператора' instanceof', чтобы проверить, является ли 'метрика' экземпляром' PerfGauge', : '((PerfGauge) метрика) .print();'. Другое, поскольку интерфейс 'metric' не знает о методе' print'. – SomeJavaGuy

ответ

3

Вы можете вызов любого метода на любом случае с помощью отражения, но вы не должны.

В вашем конкретном случае использования:

IMetric metric = new PerfGauge(name,source); 
((IPrintable)metric).print(); 

вы можете просто бросить в PerfGauge:

IMetric metric = new PerfGauge(name,source); 
((PerfGauge)metric).print(); 

... но это не очень приятно.

я вижу эти дополнительные опции неподготовленный:

  1. Добавить print в IMetric, так как вы, кажется, это нужно, где у вас есть IMetric ссылку на экземпляр.

  2. Создайте второй независимый интерфейс, IPrintable или что угодно, с print; и имеют PerfGauge реализовать это; затем используйте IPrintable вместо IMetric в вашем регионе использования.

    Пример ниже.

  3. 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(); 
}