2016-08-23 70 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