同伴中的隐含类

时间:2013-10-12 08:18:49

标签: scala implicit-conversion implicit

我认为会找到伴侣对象中的暗示。这有什么问题?

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示例有效呢?

1 个答案:

答案 0 :(得分:1)

添加一个额外的行修复了事情(您还需要显式导入伴随对象字段):

object Application{
    import Elsewhere.NamedInt
    import Elsewhere.NamedInt._

    // Compiles OK now :)
    val named: NamedInt = 3.named("bob")
}