问题是,三合会不会出现在战斗中。实际上,在doBattle()开始时立即打印gangs.size()会返回3而不是4。为什么?
双方triads
并grove street
有9所以他们来讲等于强度Gang.compareTo
(实现Comparable
)。因此,一个中只允许一个TreeSet
。
如果您不想删除按排序顺序重复的项目,请不要使用TreeSet
…
编辑:ComparableGang
接口说明指示了所期望的:
/** An `IGang` ordered by identity (name) */
public interface ComparableGang extends IGang, Comparable<IGang> {}
你的compareTo
方法确实 不是 靠力量才下订单- 订单“的标识(名称)”。老实说,它首先是一个非常愚蠢的接口,因为asoft
创建一个类public class GangNameComparator : Comparator<IGang>
,然后将其作为树集的比较器(如果他们想按名称排序)将非常容易。
但是,由于他们建议您实施比较,因此您需要按照界面说明进行操作:
public int compareTo(IGang g) {
return name.compareTo(g.getName());
}
但是…正如您在评论中(以及Rob的回答中所指出的)所指出的,这与约定俗称的IGang
描述相矛盾:
public interface IGang {
/** @return negative, 0, or positive, respectively
* if this gang is weaker than, equal to, or stronger
* than the other
*/
public int compareTo(IGang g);
}
ComparableGang
既要实现自己的文档又要满足文档是不可能的IGang
。从asoft的角度来看,这基本上是通过设计打破的。
任何代码都应该能够使用IGang
实现, 仅 了解IGang
并依赖IGang
合同之后的实现。但是,asoft通过在扩展接口中要求不同的行为打破了这一假设IGang
。
这本来是合理的为他们增添 了更多的要求 的ComparableGang
,只要他们没有违反 现行 的规定IGang
。
请注意,这是C#和Java之间的重要区别。在C#中,两个具有相同签名的不同接口中的两个函数可以组合为一个继承两个函数的接口,并且这两种方法保持不同且可访问。在Java中,这两种方法由于完全是抽象的并且具有相同的签名,因此被视为相同的方法,而实现组合接口的类仅具有一个这样的方法。因此ComparableGang
是无效的,因为它不能具有满足ComparableGang协定和IGang协定的compareTo()实现。