我正在阅读隐含转化的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中都尝试过,我没有添加任何特殊内容来编译它。
它带来了什么陷阱,为什么没有任何进口工作?
答案 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