このインターフェースと具象があるとします:
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(...) の呼び出しは機能しません。修正の 1 つは、ReportBuilder インターフェイス メソッドを次のように変更することです。
public String getStuff(List<? extends MeterValue> values);
しかし、具体的な ReportBuilders を壊します。(リストは、内容が異なる場合があるグローバル インスタンスでもあります)
何か案は?