我想要一个提取器隐式转换其参数,但它似乎不起作用。考虑这个非常简单的情况:
case class MyString(s: String) {}
implicit def string2mystring(x: String): MyString = new MyString(x)
implicit def mystring2string(x: MyString) = x.s
object Apply {
def unapply(s: MyString): Option[String] = Some(s)
}
但我无法按照我的预期使用它:
val Apply(z) = "a" // error: scrutinee is incompatible with pattern type
任何人都可以解释为什么它无法将参数从String
to MyString
?我希望它会打电话string2mystring("a")
在飞行中。显然我可以通过说来解决这个问题val Apply(y) = MyString("a")
,但似乎我不必这样做。
注意:这个问题类似于this one https://stackoverflow.com/questions/1820777/is-it-possible-to-use-implicit-conversions-for-parameters-to-extractors-unapply,但是 1)对于为什么会发生这种情况,人们并没有一个很好的答案,2)这个例子比它需要的更复杂。
模式匹配时不应用隐式转换。这不是代码的错误或问题,这只是 Scala 创建者的设计决策。
要修复它,您应该编写另一个接受的提取器String
——这又可以调用你的隐式转换。
或者,您可以尝试使用视图绑定,这似乎也有效,并且如果您稍后将其他隐式转换定义为MyString
:
object Apply {
def unapply[S <% MyString](s: S): Option[String] = Some(s.s)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)