使用下面的代碼產生了以下內容:斯卡拉List.diff .intersect和.union工作不正常
List(a, b)
List()
List(a, b, b, c)
我想是當然這樣的結果:
List(a)
List(b)
List(a, b, b, c)
我認爲這是因爲diff union和intersect相對於「==」工作。 問題是,「==」 - 運算符是最終的,不能在類「測試」中重寫。
我怎麼能達到我期望的結果?
這裏談到的使用代碼:
package scalatest;
public class JStringHolder {
String s = null;
public JStringHolder(String newString){
s = newString;
}
@Override
public String toString() {
return s;
}
@Override
public boolean equals(Object obj) {
System.out.println("SHEQ " + this.s + " AND " + ((JStringHolder)obj).s + " " + this.s.equals(((JStringHolder)obj).s));
return this.s.equals(((JStringHolder)obj).s);
}
}
和Scala代碼被執行:
package scalatest
object ListTest {
trait AbstractTest
case class Test(stringHolder: scalatest.JStringHolder) extends AbstractTest {
override def toString = stringHolder.toString()
override def equals(ot: Any) : Boolean = {
return stringHolder.equals(ot.asInstanceOf[Test].stringHolder)
}
}
def main(args : Array[String]) : Unit = {
val l1 = List(Test(new JStringHolder("a")), Test(new JStringHolder("b")))
val l2 = List(Test(new JStringHolder("b")), Test(new JStringHolder("c")))
println (l1.diff(l2))
println (l1.intersect(l2))
println (l1.union(l2))
}
}
整個問題是你需要重寫'hashCode'方法。這真的很愚蠢,但這是它目前的工作方式。希望scala更新'diff'實現,以便它基於'equals'而不是'hashCode' –
@GeorgePligor當您更改'equals'時,通常需要重寫'hashCode' - 這不是可選的,它是'hashCode' API每個類都從'Object'繼承,它在'hashCode'和'equals' JavaDoc中都有描述。如果你不這樣做,那麼你的代碼就會被打破。 –
你在說什麼可能是正確的,但我認爲這很愚蠢。我永遠不會像那樣設計它。對你來說沒有任何意義,但對那些隱含地創造你需要學習的限制的人來說,因爲編譯器永遠不會告訴你。 –