我创建了以下界面
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'的实现(而不是子类),它仍然无效。
答案 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可以解决这个问题。
希望这会对你有所帮助。