抽象子类的ArrayList(必须具有不同的hashcode)

时间:2012-05-29 01:44:21

标签: java arraylist abstract

我正在为学校项目创建一个游戏,我有一个名为Pieces and Powers的2个类,子类为Piece_Yellow,Piece_Blue ...和Power_Explode,Power_ChangeColor等......

我正在使用enum和来自这个网站的人(mikera更精确)帮助我改变它并创造一个更好的与片断和权力的互动。

但现在我必须更改旧代码,我遇到了问题,因为我这样做:

int x = 10, y = 5;
for (int i=0; i<10; i++) {
    if (pecas[x][y] == null)
        pecas[x][y] = new Piece(arrayPecas.get(rand.nextInt(arrayPecas.size())));
}

像这样,我的数组部分填充了10个新作品具有不同颜色的对象(但没有功能,这就是问题),并且每一个都有不同的哈希码(用于以后查找,比较和删除这些部分)。

但是既然我们不能初始化一个抽象类,我发现这个问题的唯一解决方案就是这样做:

int x = 10, y = 5;
for (int i=0; i<10; i++) {
    if (pecas[x][y] == null)
        pecas[x][y] = arrayPecas.get(rand.nextInt(arrayPecas.size()));
}

像这样仍然添加了对象,但现在我遇到了一个问题: 1 - 来自具有相同颜色的片段的所有哈希码都是相同的...我真的不知道如何解决这个问题。我已经读过我可以覆盖哈希码方法,但没有信息可以区分它们(我无法存储位置,因为每次更改位置时我都必须更改它。)

1 个答案:

答案 0 :(得分:2)

它似乎不是真正的hashCodes是你的问题。这是对象简单相等。依赖于具有不同hashCodes的两个不等对象的代码并不严格正确。 return 1;Object#hashCode()完全合法的实现。

最简单的事情似乎是将一个clone()方法放在Piece上,所有子类都可以实现这个方法,以便在需要不同的,不同的对象的地方返回副本。

public abstract class Piece {

  public abstract Piece clonePiece();

}

public class YellowPiece extends Piece {

  @Override
  public Piece clonePiece() {
    return new YellowPiece(this.relevantThing1, this.relevantThing2 // etc etc)
  }
}

int x = 10, y = 5;
for (int i=0; i<10; i++) {
    if (pecas[x][y] == null)
        pecas[x][y] = arrayPecas.get(rand.nextInt(arrayPecas.size())).clonePiece();
}