我有一个实现2Dtable的类。表中的元素是通用的。表格存储如下:
public Object[][] list;
问题是在这上面调用克隆显然不起作用。请注意,我的testcase初始化表以存储正常的整数。
Tabell2D<Integer> en = new Tabell2D<Integer>(5,5);
en.sett(0, 0, 55);
Tabell2D<Integer> to = en.clone();
to.sett(0, 0, 11);
assertTrue(en.equals(to));
我在这里制作一张桌子。改变它,克隆它。更改克隆,并进行比较。 克隆人显然已经改变了。即使这样,这个断言真的也是如此。
等值方法由eclipse生成:
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Tabell2D other = (Tabell2D) obj;
if (bredde == null) {
if (other.bredde != null)
return false;
} else if (!bredde.equals(other.bredde))
return false;
if (høyde == null) {
if (other.høyde != null)
return false;
} else if (!høyde.equals(other.høyde))
return false;
if (!Arrays.equals(liste, other.liste))
return false;
return true;
}
我认为问题在于列表变量的比较相等,或者问题出在克隆方法中。 克隆方法:
public Tabell2D<E> clone(){
Tabell2D<E> nyTab = new Tabell2D<E>(this.bredde,this.bredde);
nyTab.liste = liste.clone();
return nyTab;
}
答案 0 :(得分:2)
我认为问题的根源在于克隆二维数组并不深入。如果你想要一个'liste'的深层副本,你需要编写自己的代码来复制每一行(或列,具体取决于你如何看待它)。
答案 1 :(得分:-2)
克隆应该返回Object。你的“克隆”并没有覆盖正常的克隆。
另外,我不知道克隆数组会做一个深层复制。你可能最好创建一个新数组并分配元素。