了解隐式转换

时间:2016-08-23 08:29:49

标签: scala implicit-conversion

我正在阅读隐含转化的Scala documentation,并决定尝试一下:

object Main extends App {
    val test = TestConversion(100)
    test.its
}

class Test[T](val t : T) {
  def its = println(t)
}

object Test {
  def apply[T](t: T): Test[T] = new Test(t)
}

class TestConversion(v : Int) {
  val value = v
}

object TestConversion{
  implicit def implicitConversionTest2Int(ict : TestConversion): Test[Int] = Test(ict.value)
  def apply(v : Int) = new TestConversion(v)
}

正如它所说:

  

要定义自己的隐式转化,必须先导入   scala.language.implicitConversions(或用。调用编译器   -language:implicitConversions)。必须明确启用该功能,因为如果不加区别地使用它会有陷阱。

我在IntelliJ和在线IdeOne中都尝试过,我没有添加任何特殊内容来编译它。

它带来了什么陷阱,为什么没有任何进口工作?

1 个答案:

答案 0 :(得分:2)

您不需要进口任何东西。 这个想法是你可以在范围内的任何地方声明隐式转换函数。 例如:

case class Coins(amount:Int)
case class Bills(amount:Int)

object Main {
  implicit def billsToCoins(bills:Bills):Coins = Coins(bills.amount * 100)

  def printCoins(coins:Coins) = println(s"You have ${coins.amount} coins." )

  def main(args:Array[String]): Unit ={
    printCoins(Bills(3))
  }

}

我在这里声明了隐式函数billsToCoins,因此它在main函数的范围内可用。函数作为隐式转换器所需的唯一东西是拥有implicit修饰符,编译器将找到并使用它。您看到printCoins函数接受Coins类型的参数但我能够传递Bills类型的值并且已成功创建。 这是控制台输出:

You have 300 coins.

Process finished with exit code 0