代码之家  ›  专栏  ›  技术社区  ›  Carmageddon

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

  •  3
  • Carmageddon  · 技术社区  · 8 年前

    假设我定义了以下内容:

    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和度量都在执行。 IReport<KibanaRow> IReport<MetricRow> 分别是,而ireport接口看起来像:

    public interface IReport<T> {
        void addRow(T row);
    }
    

    我不喜欢所有这些铸造,这感觉不正确,也不给我自动完成,所以有任何建议如何正确地做它?

    1 回复  |  直到 8 年前
        1
  •  3
  •   ernest_k Petronella    8 年前

    从你所张贴的,很明显,两者都 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();
        }
    }
    

    此版本允许编译器理解并验证 我报告 将永远传递给 export() 。使用此方法的代码将由编译器验证,以便 MetricExporter().export() 只能使用类型为的对象调用 米制 KibanaExporter().export() 对象类型为 基巴纳 .
    这样,就不再需要类型转换了。