我有以下界面,没有任何方法。
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 :(得分:3)
您可以通过反射调用任何实例上的任何方法,但您不应该。
在您的具体用例中:
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();
}