Я не совсем уверен: может быть, ошибка, если реализация diff? Использование устаревшего --
вместо diff
на самом деле работает для меня. Set
вместо List
тоже работает.
У меня нет ответа (только предложение использовать Set в качестве обходного пути), но я добавляю сюда свои собственные тесты на случай, если они могут помочь кому-то еще вернуться с ответом:
// re-implementing JStringHolder in scala
// to show that this is not java-specific
class JStringHolder(val st: String) {
override def equals(that: Any): Boolean = that match {
case t: JStringHolder => this.st == t.st
case _ => false
}
}
case class Test(stringHolder: JStringHolder) {
override def equals(that: Any) : Boolean = that match {
case t: Test => this.stringHolder == t.stringHolder
case _ => false
}
}
теперь в REPL (scala 2.9.0.1):
scala> List(Test(new JStringHolder("a")), Test(new JStringHolder("b")))
res0: List[Test] = List(a, b)
scala> List(Test(new JStringHolder("c")), Test(new JStringHolder("b")))
res1: List[Test] = List(c, b)
scala> res0 diff res1
res2: List[Test] = List(a, b)
- устарела, но работает
scala> res0 -- res1
<console>:13: warning: method -- in class List is deprecated: use `list1 filterN
ot (list2 contains)` instead
res0 -- res1
^
res3: List[Test] = List(a)
делать это с помощью фильтраНе, как подсказывает предупреждение об устаревании, тоже работает
scala> res0 filterNot (res1 contains )
res4: List[Test] = List(a)
Также показывает, что все работает с Set
scala> Set(Test(new JStringHolder("a")), Test(new JStringHolder("b")))
res0: scala.collection.immutable.Set[Test] = Set(a, b)
scala> Set(Test(new JStringHolder("b")), Test(new JStringHolder("c")))
res1: scala.collection.immutable.Set[Test] = Set(b, c)
scala> res0 diff res1
res2: scala.collection.immutable.Set[Test] = Set(a)
scala> res0 union res1
res3: scala.collection.immutable.Set[Test] = Set(a, b, c)
scala> res0 intersect res1
res4: scala.collection.immutable.Set[Test] = Set(b)