您可以通过反射在任何实例上调用任何方法,但您不应该这样做。
在您的特定用例中:
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
下面的例子。
绑定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();
}