所以给出了清单:
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变量,导致可能很难找到错误。
谢谢!
答案 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的类型系统中定义这样的接口很难(不可能?)。