假设我有这个接口和混凝土:我怎样才能让用Java泛型这项工作
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;
我想改变报表创建实例作为如下:
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。 (列表也是全球实例,其内容可能会有所不同)
任何想法?
谢谢。我实施了工厂模式,有点。可以说具体的ReportBuilder是要创建的产品。那么工厂应该创建不同的产品。无论如何,我必须决定创建哪个工厂?那么为什么不直接创建产品。也许它会更灵活/可扩展的工厂模式的方式。 – Filip
@Filip我认为这里有点混乱。抽象工厂和工厂方法模式是不同的!抽象工厂提供了一个由具体工厂实现的接口,其中包含创建实例的方法。工厂方法就是创建相应实例的独立方法 - 因此抽象工厂模式中的每个具体工厂实现都有一个工厂方法 - 创建实例的工厂方法。现在看来你只需要这种方法 - 所以只有一个工厂。所以你将有一个工厂创建生成器实例... – ppeterka
好吧。我有一堂课; “BuilderFactory”具有返回“corect”构建器实例的静态工厂方法。 – Filip