-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();
4

1 回答 1

3

可以通过反射在任何实例上调用任何方法,但您不应该这样做。

在您的特定用例中:

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

你可以投到PerfGauge

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

...但这并不是很令人满意。

我看到了这些进一步的选择:

  1. 添加printIMetric,因为您在IMetric引用实例的地方似乎需要它。

  2. 使用;创建第二个独立界面IPrintable或其他任何东西 printPerfGauge实施;然后在您的使用位置使用IPrintable而不是。IMetric

    下面的例子。

  3. 绑定IPrintableIMetric( ) 以在您的使用位置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();
}
于 2016-08-10T07:26:13.080 回答