为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

茅侃侃 2021-04-16 18:15:06
因此,假设我定义了以下内容: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);}我不喜欢所有这些转换,这感觉不正确,也无法自动完成,所以有什么建议如何正确执行吗?
查看完整描述

1 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

从您发布的内容来看,很显然,Kibana和Metric都是的子类型IReport。


在这种情况下,您可以使接口通用:


interface IExportTool<R extends IReport> {

    void export(R iReport);

}

然后以这种方式更改实现:


public class KibanaExporter implements IExportTool<Kibana>{


    public void export(Kibana kibana) {

        kibana.toJSON();

    }

}

和:


public class MetricExporter implements IExportTool<Metric> {

    public void export(Metric metric) {

        metric.toJSON();

    }

}

此版本允许编译器理解并验证只有的子类型实例IReport会传递给export()。使用此代码将由编译器,使得验证MetricExporter().export()只能与类型的对象被调用Metric并KibanaExporter().export()与类型的对象Kibana。

这样,就不再需要类型转换。


查看完整回答
反对 回复 2021-04-21
  • 1 回答
  • 0 关注
  • 209 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信