假设我有这个接口和具体:
public interface MeterValue {}
public class MeterValueA implements MeterValue {}
public class MeterValueB implements MeterValue {}
public interface ReportBuilder<T extends MeterValue> {}
public class ReportBuilderA implements ReportBuilder<MeterValueA> {}
public class ReportBuilderB implements ReportBuilder<MeterValueB> {}
我有一个全局实例:
ReportBuilder<MeterValue> reportBuilder;
我想改变 reportBuilder 实例如下:
if (isA())
reportBuilder = new ReportBuilderA();
else
reportBuilder = new ReportBuilderB();
reportBuilder.desiredMethod();
这样做我得到“类型不匹配”。如何获得我想要的功能?或者我怎样才能改进我的课堂设计,使其更加灵活?
编辑:
通配符?解决了这个问题。但也引入了其他问题。假设我在界面中有这个方法:
public interface ReportBuilder<T extends MeterValue> {
public String getStuff(List<T> values);
}
public class ReportBuilderA implements ReportBuilder<MeterValueA> {
@Override
public String getStuff(List<MeterValueA> values) { return "A"; }
}
public class ReportBuilderB implements ReportBuilder<MeterValueB> {
@Override
public String getStuff(List<MeterValueB> values) { return "B"; }
}
假设我有这个实例:
ReportBuilder<? extends MeterValue> reportBuilder = new ReportBuilderA();
和:
List<? extends MeterValue> list = new ArrayList<MeterValueA>();
String s = reportBuilder.getStuff(list);
由于列表包含通配符,因此对 getStuff(...) 的调用将不起作用。一种解决方法是将 ReportBuilder 接口方法修改为:
public String getStuff(List<? extends MeterValue> values);
但后来我打破了具体的 ReportBuilders。(列表也是一个全局实例,内容可能会有所不同)
有任何想法吗?