2016-08-10 19 views
-1

私には以下のインタフェースがあり、メソッドはありません。タイプ境界を使用して、インタフェースに存在しないクラスのメソッドを呼び出す

public interface IMetric { 
} 

私は以下の方法で実装しています。

public class PerfGauge implements IMetric { 

    public PerfGauge(String name, final Object gaugeSource) { 

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

IMetricを型として持つPerfGaugeクラスのメソッドを呼び出すにはどうすればよいですか?私はこれがタイプ境界を介して行われると信じていますか?もしそうなら、誰かが例を助けることができますか?である私は何をしたい

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

を '' IMetric'にprint'追加しないのはなぜ? –

+1

メソッドがインタフェースにない場合は、 'metric'変数を実装クラスの型にキャストすることによってのみメソッドを呼び出すことができます。 – Eran

+0

これを行う唯一の方法は、 'IMetric'の' interface'メソッドに 'print'メソッドを含めるか' instanceof'演算子を使って 'metric'が' PerfGauge'のインスタンスであるかどうかをチェックし、 : '((PerfGauge)メトリック).print();'。 'メトリクス'インターフェースが 'print'メソッドについて知りません。 – SomeJavaGuy

答えて

3

あなたできコール任意の反射を介した任意のインスタンスのメソッドが、あなたはいけません。

あなたの特定のユースケースで:

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

...しかし、それは非常に満足ではありません。

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

あなただけPerfGaugeにキャストすることができます。

私はオフカフこれらの追加オプションを参照してください。あなたは、インスタンスへの参照IMetricを持ってどこにそれを必要とするように見えるよう

  1. は、IMetricprintを追加します。

  2. 第2の独立したインターフェイスIPrintableまたはそれ以外のものをprintで作成します。 PerfGaugeに実装してください。使用場所にIMetricの代わりにIPrintableを使用してください。

    以下の例。

  3. タイIPrintableは(public interface IPrintableMetric extends IMetricIMetricから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(); 
} 
関連する問題