使用类型边界调用接口中不存在的类中的方法

时间:2016-08-10 07:22:40

标签: java oop types interface type-bounds

我有以下界面,没有任何方法。

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

1 个答案:

答案 0 :(得分: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. IPrintable绑定到IMetricpublic interface IPrintableMetric extends IMetric)以创建IPrintableMetric并在您的使用位置使用

    IPrintableMetric metric = new PerfGauge(name,source);
    metric.print();
    
  4. 根据您在问题评论中提到的限制,听起来像是一个独立的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();
    }