我希望提取器可以隐式转换其参数,但似乎不起作用。考虑这个非常简单的情况:
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
转换为MyString
吗?我希望它会即时调用string2mystring("a")
。显然,我可以通过说val Apply(y) = MyString("a")
来解决这个问题,但是我不认为我应该这样做。注意:这个问题类似于这个问题,但是1)那个问题并没有一个好的答案解释为什么会发生这种情况,2)示例比它需要的更加复杂。
def unapply(p: String): Option[String] = Some(p)
添加到Apply
中就可以了。所以我会选择这个方案。谢谢。 - dhgunapply
使用元组,则由于类型擦除,您无法使用重载技巧。但是这个解决方案干净利落地解决了这个问题,并导致编译时错误的参数类型不正确:def unapply[S <% MyString](p: (S, Int)): Option[String] = Some(p._1.s + p._2)
。 - dhg