java构造函数可以将接口作为参数

时间:2015-01-20 10:27:50

标签: java interface constructor

我正在尝试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

有人可以帮忙解决它为什么不起作用吗?

谢谢:)

2 个答案:

答案 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;
}