2015-06-01 59 views
3

考虑以下几点:列表(1)#contains()返回`FALSE`

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

+0

'():Unit'是它从'contains()'中获得的参数。 –

回答

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(()),并推断类型A1AnyVal,这是UnitInt的最小上限。

简短的回答:不要这样做,这是不好的。稍微长一些:不要这样做,这是不好的,如果编译器建议用-deprecation重新运行,那就把它放在提供上 - 这可能会让事情变得更清晰。

+1

相关:http://scalapuzzlers.com/#pzzlr-040 –

+0

为什么不将'lub'解析为AnyVal而不是'Any'? 'scala> lub(List(typeOf [Int],typeOf [Unit])) res28:reflect.runtime.universe.Type = AnyVal' –

+0

@KevinMeredith噢,你对'AnyVal'可能是正确的。尽管如此,它并没有什么区别,因为这种类型在任何地方都没有使用('contains'有效地使用了'Any',这是使得它几乎毫无价值的几个问题之一)。 –

相关问题