我想在这里实现的是由子类决定是否要将 java.lang.String 或 java.util.HashMap 作为参数传递给 query() 方法。接口只需要声明子类必须实现查询方法,但我不关心子类要传入什么类型的参数。
我有一个类似的界面:
interface A<T>{
public void query(T type);
}
两个子类,如:
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);
但是通过这样做,我将依赖于 B 而不仅仅是 A(接口),这是我一开始就想避免的。知道如何在不依赖子类(在本例中为 B 和 C)的情况下做到这一点。