我正在使用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。但是,我发现的最新文档包含了我之前提供的定义。
答案 0 :(得分:4)
StringOps
扩展StringLike
扩展IndexedSeqOptimized[Char, String]
,它在元素类型中是协变的。这意味着你可以这样做:
val s: IndexedSeqOptimized[Any, String] = "hello"
这意味着您可以提供Any
包含的实例,m
是。