我正在尝试Java接口,以下代码给出了错误。
在类中,构造函数将Map作为参数
public class ClassA{
private Map<String,InterfaceA> testMap;
ClassA(Map<String,InterfaceA> testMap){
this.testMap=testMap;
}
}
public class ClassB{
ClassA testA = new ClassA(new HashMap<String,ImplmntsInterfaceA>); //1st declaration
Map<String,ImplmntsInterfaceA> testMap=new HashMap<String,ImplmntsInterfaceA>(); //Second declaration
ClassA testB = new ClassA(testMap);
}
ImplmntsInterfaceA
是一个实现InterfaceA
的类。
ClassA
声明都出错,首先建议将地图构造函数更改为HashMap
,然后再要求将InterfaceA
泛型替换为ImplmntsInterfaceA
。
有人可以帮忙解决它为什么不起作用吗?
谢谢:)
答案 0 :(得分:5)
我怀疑您要在Map<String,InterfaceA>
构造函数签名(和字段)中将Map<String, ? extends InterfaceA>
更改为ClassA
。否则,HashMap<String, ImplmntsInterfaceA>
实际上并不是它的有效参数。
考虑Map<String,InterfaceA>
上哪些操作有效 - 您可以写:
map.put("foo", new SomeArbitraryImplementationOfA());
这对Map<String, ImplmntsInterfaceA>
无效,因为后者的值必须是ImplmntsInterfaceA
。编译器正在保护您。
如果您使用Map<String, ? extends InterfaceA>
,则无法在ClassA
内进行任何编写操作(因为您不知道哪些值是有效)但你知道每个值至少实现InterfaceA
,你就能从地图中获取。
这基本上是List<Banana>
不是List<Fruit>
...
答案 1 :(得分:0)
请查看您的ClassA
构造函数。
ClassA(Map<String,InterfaceA> testMap){ // *
this.testMap=testMap;
}
现在,您的construcotr(*)将接受Map<String, InterfaceA>
类型或Map<String,InterfaceA>
实施。例如:HashMap<String, InterfaceA>
。
您可以将构造函数更改为以下接受HashMap<String,ImplmntsInterfaceA>
例如:
ClassA(Map<String,? extends InterfaceA> testMap){
this.testMap=testMap;
}