Scala 隐式导入仅在使用时才被导入。

3

我刚接触 Scala 并正在尝试一些实践练习。

我想通过将隐式转换函数放在伴生对象中来使用隐式转换。但是,编译器只会在使用时才检测到隐式转换。

class ImplicitTest {
    import Implicits.implicitInt;
    println(implicitInt)
    def implicitm1(implicit i : Int) = 1
    println(implicitm1)
}
object Implicits {
    implicit val implicitInt = 1
}

这段代码可以成功编译。但是,如果我注释掉第三行

\\println(implicitInt)`

那么我得到了编译时错误。
println(implicitm1)` 

这段文字是说

could not find implicit value for parameter i:Int`

not enough arguments for method implicit m1(implicit i:Int) . Unspecified value parameter i`

我在这里做错了什么?

提前感谢。

2个回答

4
如果您在val implicitInt: Int = 1中包含类型,它就会起作用。这种问题正是推荐始终为隐式指定类型的原因之一。
Scala类型推断从上到下工作,所以在您的情况下,当编译器检查println(implicitm1)行时,它还不知道这个类型。
我猜当您包含println(implicitInt)时,编译器被迫在那一行找到implicitInt的类型。

0

另一种解决方案是将隐式对象的定义移动到类ImplicitTest之上。

在这种情况下,implicitInt的类型已经被推断出来了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接