Scala尴尬包含行为

时间:2015-07-13 13:25:40

标签: scala generics

我正在使用Scala编写一个简单的应用程序,我发现了一个非常奇怪的行为。我能够调用String类的contains方法并将任何对象传递给它。这是一个简单的代码来说明它。我使用了一个工作表,我认为没有必要编写一个main方法,因为它无关紧要。

class Man
val m = new Man
"hello".contains(m)

我很惊讶Scala编译器没有抱怨并返回false。所以我决定更深入地研究一下包含。

首先,String类本身没有contains方法。它位于StringOps类中,据我所知,String可以隐式转换。 Scala 2.11 docs中的方法如下所示:

  

def包含[A1>:Char](elem:A1):Boolean

     

测试此序列是否包含给定值作为元素。

因此,正如我理解的类型边界,elem必须是Char的超类型。问题是,这怎么可能,Man类是Char的超类型?有隐含的转换吗?我注意到2.10 Scala文档包含另一个contains的定义:

  

def contains(elem:Any):Boolean测试此字符串是否包含   给定值作为元素。

这个方法看起来很合乎逻辑,因为Man类显然是Any。但是,我发现的最新文档包含了我之前提供的定义。

1 个答案:

答案 0 :(得分:4)

StringOps扩展StringLike扩展IndexedSeqOptimized[Char, String],它在元素类型中是协变的。这意味着你可以这样做:

val s: IndexedSeqOptimized[Any, String] = "hello"

这意味着您可以提供Any包含的实例,m是。