ここで達成したいのは、サブクラスがjava.lang.Stringまたはjava.util.HashMapをパラメータとしてquery()メソッドに渡すかどうかを決定することです。インターフェイスは、サブクラスがクエリメソッドを実装する必要があると主張する必要がありますが、どのタイプのパラメータサブクラスを渡したいかは気にしません。
私は次のようなインターフェースを持っています:
interface A<T>{
public void query(T type);
}
次のような2つのサブクラス:
public class B implements A<String> {
public void query(String type);
}
public class C implements A<HashMap> {
public void query(HashMap type);
}
次に、BまたはCを生成するファクトリクラスがあります。
public class AFactory {
public static A<?> getType(String type) {
if(type.equals("B")){
return new B();
} else if(type.equals("C")) {
return new C();
}
}
}
アイデアは、クライアントが次のようにB、Cに依存することなく、以下のようなインターフェイスを使用できるということです。
A instance = AFactory.getType("B");
String a = "test";
instance.query(a);
私がここで抱えている問題は次のとおりです。eclipseはinstance.query(a)の行でエラーを出します:
タイプAのメソッドquery(capture#2-of?)は、引数(String)には適用できません。
問題は、インターフェイスコントラクトが、クエリがStringまたはHashMapを予期している必要があることを認識していないことだと思います。私がこれを解決することしか考えられない方法は、次のような結果をキャストする必要があるということです。
B instance = (B)AFactory.getType("B");
String a = "test";
instance.query(a);
しかし、これを行うことで、最初は避けたかったA(インターフェイス)だけでなく、Bに依存するようになります。サブクラス(この場合はBとC)に依存せずにこれを行う方法についてのアイデア。