我可以在Scala案例类中使用隐式转换方法吗?

时间:2016-05-28 11:57:50

标签: scala implicit

是否可以在类中执行隐式转换的方法。在这种情况下,我希望能够立即将一个代表一对东西的对象解包为2元组。

case class Foo(a:String, b:String) {
  implicit def asTuple:(String, String) = (a,b)
}
val foo0 = new Foo("Hello", "World")

// Does not work!
val (a:String, b:String) = foo0

上面的例子已经破了。

这是我的第二次尝试 - 也被打破了:

class Foo(a:String, b:String) {
  val _a:String = a
  val _b:String = b
}

implicit def asTuple(x:Foo):(String, String) = (x._a, x._b)

val foo0 = new Foo("Hello", "World")

// Does not work!
val (a:String, b:String) = foo0

鉴于我已经设法将隐式类型转换从一个类转换为另一个类'just work',我希望这里出现的问题更多地与将元组定义为返回类型有关。有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:4)

您的第一个示例不起作用,因为您必须在伴随对象中或在您使用第二个示例完成的其他范围中定义隐式。 第二个例子似乎不起作用,因为Scala无法在一个步骤中进行模式匹配和隐式转换。而是将最后一行更改为以下之一以使其正常工作:

val (a:String, b:String): (String, String) = foo0

val (a: String, b: String) = foo0: (String, String)

答案 1 :(得分:3)

这不起作用的原因是=左侧有一个模式,如示例所示,与

完全相同
foo0 match {
  case (a: String, b: String) => 
    // the rest of the body
}

(如果匹配失败,将抛出MatchError。)

Scala类型推断从左到右工作,因此它首先解决foo0,并且没有预期的类型来触发隐式转换。只有这样它才能看到模式不可能与类型匹配。

相关问题