当使用这个lambda速记时,为什么编译器不能选择正确的String.containes方法? [英] Why can't the compiler select the correct String.contains method when using this lambda shorthand?
本文介绍了当使用这个lambda速记时,为什么编译器不能选择正确的String.containes方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
假设我要检查字符串是否包含中的任何字母
def hasCory(input: String): Boolean = {
val myName = "cory"
input.exists(myName.contains)
}
编译器出现以下错误:
error: type mismatch;
found : CharSequence => Boolean
required: Char => Boolean
Scala提供了我想要的Char
-接受方法in StringOps:
但似乎编译器无法看到此方法,除非我将代码更改为以下之一:
input.exists(myName.contains(_))
input.exists(c => myName.contains(c))
相反,在原始示例中,它似乎使用Java String's contains
method,这实际上接受CharSequence
:
这是否按预期工作?为什么编译器看不到我需要Char
版本的contains
?
推荐答案
StringOps
为an implicit conversion
@inline implicit def augmentString(x: String): StringOps = new StringOps(x)
和隐式转换仅适用于in three cases:
- 如果表达式𝑒的类型为𝑇,并且𝑇不符合该表达式的预期类型pt。
- 在选择𝑒.𝑚中 对于类型为𝑒的𝑇,如果选择器𝑚不表示𝑇的可访问成员。
- 在选择𝑒.𝑚(Args)中 对于类型为𝑒的𝑇,如果选择器𝑚表示𝑇的某些成员,但这些成员都不适用于参数args。
当您编写myName.contains
时,它不是这三种情况中的一种(特别是
不是第二种情况,因为contains
是String
)的可访问成员,因此StringOps
无法应用,并且它是String#contains(CharSequence)
和类型不匹配错误。
当您编写myName.contains(_)
或c => myName.contains(c)
时,它是第三个大小写,因此StringOps
可以应用,并且它在隐式转换之后是StringOps#contains(Char)
。
所以是的,它工作正常。
这篇关于当使用这个lambda速记时,为什么编译器不能选择正确的String.containes方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文