为什么Scala List [Int] .contains接受Option [Int]?

时间:2015-07-17 00:03:17

标签: scala

所以给出了清单:

val a:List[Int] = List(1,2,3)

你可以这样做:

a.contains(Option(2))

返回false。我从以下函数定义中理解,允许这种编译完全是故意的:

def contains[A1 >: A](elem : A1) : scala.Boolean = {...}
sealed abstract class Option[+A]() ...

我不明白为什么 - 是否有一个有用的用例?如果它在比较之前自动展平选项,那么上面的返回为true则可能有用,但是它总是会返回false。

我问,因为很容易忘记打开传递给List.contains的Option变量,导致可能很难找到错误。

谢谢!

1 个答案:

答案 0 :(得分:4)

想象一下:

sealed trait Result
case class SimpleResult(x: Int) extends Result
case class FancyResult(x: Int, y: Int) extends Result

val okResults: List[SimpleResult] = // ...

def calcResult: Result = ???

okResults.contains(calcResult)

在这种情况下,您可以使用contains类型的超类型调用List

在您的情况下,会发生令人讨厌的副作用:Option[Int]不是Int的超类型。但是,他们有一个共同的超类型:Any。因此,您对contains的致电推断为:

a.contains[Any](Option(2))

由于Option[Int]Any的子类型,因此您可以将其传递给contains。在大多数情况下,这可能是您不想要的,但在Scala的类型系统中定义这样的接口很难(不可能?)。