如何在Java中的多个实现类中使用双接口?

因此,假设我定义了以下内容:


public interface IExportTool {

    void export(IReport iReport);

}

然后尝试使用它:


public class KibanaExporter implements IExportTool{


    public void export(IReport kibana) {

        kibana = (Kibana) kibana;

        ((Kibana) kibana).toJSON();

    }

}

但是,还有其他类也会再次做类似的事情:


public class MetricExporter implements IExportTool{


public void export(IReport metric) {

    metric = (Metric) metric;

    ((Metric) metric).toJSON(); // might be something else here like toXML etc

}

}


请注意,Kibana和Metric都分别在实现IReport<KibanaRow>和实现IReport<MetricRow>,而IReport接口的外观如下:


public interface IReport<T> {

    void addRow(T row);

}

我不喜欢所有这些转换,这感觉不正确,也无法自动完成,所以有什么建议如何正确执行吗?


茅侃侃
浏览 210回答 1
1回答

开心每一天1111

从您发布的内容来看,很显然,Kibana和Metric都是的子类型IReport。在这种情况下,您可以使接口通用:interface IExportTool<R extends IReport> {&nbsp; &nbsp; void export(R iReport);}然后以这种方式更改实现:public class KibanaExporter implements IExportTool<Kibana>{&nbsp; &nbsp; public void export(Kibana kibana) {&nbsp; &nbsp; &nbsp; &nbsp; kibana.toJSON();&nbsp; &nbsp; }}和:public class MetricExporter implements IExportTool<Metric> {&nbsp; &nbsp; public void export(Metric metric) {&nbsp; &nbsp; &nbsp; &nbsp; metric.toJSON();&nbsp; &nbsp; }}此版本允许编译器理解并验证只有的子类型实例IReport会传递给export()。使用此代码将由编译器,使得验证MetricExporter().export()只能与类型的对象被调用Metric并KibanaExporter().export()与类型的对象Kibana。这样,就不再需要类型转换。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java