鉴于两个List[A]
个实例,在什么情况下可能会出现以下情况?
list.head == otherList.head // returns true
list.size == 1 // returns true
list.size == otherList.size // returns true
但
list == otherList // returns false
答案 0 :(得分:3)
如果我可以欺骗并使用我自己的A
,那么这就是一个例子:
scala> :pa
// Entering paste mode (ctrl-D to finish)
class MyClass(val v: Int)
{
def ==(that: MyClass): Boolean = true
}
// Exiting paste mode, now interpreting.
defined class MyClass
scala> val l1 = List(new MyClass(1))
l1: List[MyClass] = List(MyClass@36776c32)
scala> val l2 = List(new MyClass(2))
l2: List[MyClass] = List(MyClass@39c87b42)
scala> l1.head == l2.head
res4: Boolean = true
scala> l1.size == l2.size
res5: Boolean = true
scala> l1.size == 1
res6: Boolean = true
scala> l1 == l2
res7: Boolean = false
你甚至不需要为此提供可变值,这只是一个使用我自己的==
方法的技巧。但这是故意恶意的,希望没有人会编写可以做到这一点的代码。
修改强>
您需要做的就是a)技巧/中断==
,就像我对MyClass
所做的那样,或者正如@ 2rs2ts指出的那样,欺骗/打破sameElements
检查(使用!=
):
def sameElements[B >: A](that: GenIterable[B]): Boolean = {
val these = this.iterator
val those = that.iterator
while (these.hasNext && those.hasNext)
if (these.next != those.next)
return false
!these.hasNext && !those.hasNext
}