返回一个接口集合

时间:2011-01-17 10:36:52

标签: java generics

我创建了以下界面

public interface ISolutionSpace {
  public boolean isFeasible();
  public boolean isSolution();
  public Set<ISolutionSpace> generateChildren();
}

但是,在名为ISolutionSpace的类中实现EightQueenSolutionSpace时,我将返回一组EightQueenSolutionSpace个实例,如下面的存根:

@Override
public Set<ISolutionSpace> generateChildren() {
  return new HashSet<EightQueenSolutionSpace>();
}

但是这个存根不会编译。我需要做出哪些改变?

编辑:我也试过'HashSet',并尝试使用extends关键字。但是,由于'ISolutionSpace'是一个接口,而EightQueenSolutionSpace是'ISolutionSpace'的实现(而不是子类),它仍然无效。

7 个答案:

答案 0 :(得分:9)

两种可能性:

@Override
public Set<? extends ISolutionSpace> generateChildren() {
  return new HashSet<EightQueenSolutionSpace>();
}

或者

@Override
public Set<ISolutionSpace> generateChildren() {
  return new HashSet<ISolutionSpace>();
}

并简单地将EightQueenSolutionSpace的实例添加到集合中。

答案 1 :(得分:3)

请注意,继承和其他对象层次结构功能在泛型中并不完全像预期的那样。

但这不是你唯一的问题:你试图将ArrayList作为Set的实现返回,这无效!

关于泛型部分,当您编写Set<ISolutionSpace>时,您要对编译器说明需要ISolutionSpace的实例集合,而不是ISolutionSpace的可能子类。要允许使用子类,您必须使用? extends ISolutionSpace,它精确地说“接受ISolutionSpace的任何子类”。

因此,要拥有有效的代码,您必须更改界面和实现。

您的界面应该成为

public interface ISolutionSpace {
  public boolean isFeasible();
  public boolean isSolution();
  public Set<? extends ISolutionSpace> generateChildren();
}

您的实施

@Override
public Set<? extends ISolutionSpace> generateChildren() {
  //for()
  return new HashSet<EightQueenSolutionSpace>();
}

答案 2 :(得分:1)

return new HashSet<ISolutionSpace>();

HashSet中的所有引用都可以指向EightQueenSolutionSpace实例,但泛型类型应该是ISolutionSpace。

答案 3 :(得分:0)

Set和List是不同类型的集合。

您可以更改声明以返回列表,或将返回参数类更改为Set的实现(HashSet,TreeSet ...)

答案 4 :(得分:0)

根据Java API:

  

接口集

     

所有超级接口:集合   所有已知子接口:SortedSet All

     

已知的实施类:   AbstractSet,HashSet,LinkedHashSet,   TreeSet中

我认为您必须将Set替换为List:

  

接口列表

     

所有超级接口:集合

     

所有   已知的实现类:   AbstractList,ArrayList,LinkedList,   向量

答案 5 :(得分:0)

假设调用者反过来使用通用ISolutionSpace界面而不是特定EightQueenSolutionSpace,只需将generateChildren方法更改为public Set<? extends ISolutionSpace> generateChildren()

答案 6 :(得分:0)

Java中的所有类型的集合都是这样的:

Collection
├List
│  ├LinkedList
│  ├ArrayList
│  └Vector
│     └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap

所以这个错误很明显。尝试修改Set into List可以解决这个问题。

希望这会对你有所帮助。