因此,假设我定义了以下内容: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。
这样,就不再需要类型转换。
添加回答
举报
0/150
提交
取消