我想在这里实现的目标是让子类决定是否要将java.lang.String或java.util.HashMap作为参数传递给query()方法。 接口只需要声明子类必须实现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)。
我认为问题在于接口合同不知道query应该期望一个String还是HashMap。我唯一能想到的解决办法是将结果强制转换,如下所示:
B instance = (B)AFactory.getType("B");
String a = "test";
instance.query(a);
但是,这样做会导致我依赖于B而不仅仅是A(接口),这是我一开始想要避免的。有没有办法在不依赖子类(在这种情况下,B和C)的情况下实现这一点呢?