scala中的隐式转换

时间:2017-06-28 15:34:20

标签: scala

Scala是否对对象进行了隐式转换?例如,如果我有一个带有以下签名的方法:

object Foo {
  def print(message: String) = println(message)
}

class Bar {
    val baz = 1
}

如何拨打Foo.print(new Bar)

我可以在Bar类上放置一个方法来隐式地将Bar实例转换为字符串,而不必在参数中调用toString吗?

C#有这个,我想知道scala是否也这样做。

我们说我们有Scala enum:

object Color extends Enumeration {

  type Method = Value

  val RED, BLUE, GREEN = Value

 }

然后我有一个班级:

object ColorPrinter {
  def print(x: String) = {
    println(x)
  }
}

ColorPrinter的打印方法无法更改。

我想打电话给ColorPrinter.print(Color.RED),但我无法做到。我必须这样称呼它:ColorPrinter.print(Color.RED.toString)

我想避免使用toString

3 个答案:

答案 0 :(得分:2)

将内容隐式转换为基本类型,例如StringInt并不是一个非常好的主意(隐式转换可能会在您不期望的地方触发,创建微妙的,难以调试,问题)。

为什么不让它明确? ?

class Bar {
   val baz = 1
   def print = Foo.print(toString)
}

new Bar().print

答案 1 :(得分:2)

您可以放置​​可以自动应用的隐式转换,而无需导入到类的伴随对象中:

class Bar {
  val baz = 1
}

// This should be the companion object of `Bar`, so if in console, use :paste mode
object Bar {
  implicit def toString(bar: Bar): String = bar.toString
}

scala> Foo.print(new Bar) // works without `import Bar._`
$line7.$read$$iw$$iw$Bar@280ecc33

对于Enumeration,您可以将转换放入对象本身:

object Color extends Enumeration {

  type Method = Value

  val RED, BLUE, GREEN = Value

  implicit def toString(value: Value): String = value.toString 
}

scala> ColorPrinter.print(Color.RED) // works without `import Color._`
RED

您可以在此答案中阅读有关Scala隐式解决方案的更多信息:https://stackoverflow.com/a/5598107/1098230

答案 2 :(得分:1)

这是一种典型的方法, 是的,隐式非常类似于C#静态方法,它以特殊的方式实现:

object Foo {
  def print(message: String) = println(message)
}

class Bar {
  val baz = 1
}

object BarToStringMaker {
   implicit def barToString(b : Bar) : String = b.baz.toString
}

import BarToStringMaker._

Foo.print(new Bar)

更多阅读:

http://www.artima.com/pins1ed/implicit-conversions-and-parameters.html

希望有所帮助,