【发布时间】:2013-02-01 09:09:25
【问题描述】:
假设我有这个接口和混凝土:
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。 (列表也是一个全局实例,内容可能会有所不同)
有什么想法吗?
【问题讨论】:
标签: java generics class-design