List(1)#contains()返回`false`

时间:2015-06-01 20:14:32

标签: scala

鉴于以下内容:

scala> List(1).contains()
warning: there was one deprecation warning; re-run with -deprecation for details
res18: Boolean = false

为什么false会返回?

List#contains有签名:

def contains[A1 >: A](elem: A1): Boolean

因此,据我所知,contains参数必须等于或高于A的类型。

为什么这会返回false

1 个答案:

答案 0 :(得分:7)

如果您使用-deprecation再次运行它(根据警告的建议),您会看到:

scala> List(1).contains()
<console>:8: warning: Adaptation of argument list by inserting ()
  has been deprecated: this is unlikely to be what you want.
        signature: LinearSeqOptimized.contains[A1 >: A](elem: A1): Boolean
  given arguments: <none>
 after adaptation: LinearSeqOptimized.contains((): Unit)
              List(1).contains()
                              ^
res0: Boolean = false

因此List(1).contains()被解析为List(1).contains(()),而A1的推断类型为AnyVal,这是Unit的最小上限和{ {1}}。

简短的回答:不要这样做,这很糟糕。稍微长一些:不要这样做,这很糟糕,如果编译器建议重新运行Int,那就把它拿出去 - 它可能会让事情变得更清晰。