2016-08-23 56 views
0

我读隐式转换的斯卡拉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

这是一些你正在阅读的旧东西。您不必导入任何内容以使用隐式转换。你可能不得不添加编译器标志,但否则它会给你编译时*警告*。 – sebszyller

+0

@sebszyller但他们谈论什么陷阱? – user3663882

+1

当你有很多暗示时,很难追踪它们并导致代码的原因。这就是为什么通配符导入如果不谨慎谨慎地如此危险的原因之一。 – sebszyller

回答

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