【发布时间】:2013-10-12 08:18:48
【问题描述】:
我认为会找到伴随对象中的隐含。这有什么问题?
object Elsewhere{
case class NamedInt(i: Int, name: String)
object NamedInt{
implicit class ToNamedInt(i: Int){
def named(name: String) = NamedInt(i, name)
}
}
}
object Application{
import Elsewhere.NamedInt
//Error: value named is not a member of Int
val named: NamedInt = 3.named("bob")
}
更新:我意识到我可以直接导入隐式类,但我认为它应该在没有它的情况下编译,因为隐式在伴随对象中。例如。这无需额外的导入即可工作
object Elsewhere{
case class MyInt(i: Int)
object MyInt{
import scala.language.implicitConversions
implicit def myIntToSome(t: MyInt): Some[Int] = Some(t.i)
}
}
object Application{
import Elsewhere.MyInt
val o: Option[Int] = MyInt(1)
}
更新 2:
Jesse Eichar comments on his blog:
您将隐式参数解析与隐式对象混淆了 转换。隐式对象转换具有潜在危险,因此 它们通常必须显式导入到作用域中。
注意事项是在超类中定义的隐式对象转换 和(我很确定)包中的对象自动在范围内。
这对我来说很有意义,但是为什么上面的 MyInt 示例有效?
【问题讨论】:
标签: scala implicit-conversion implicit