【问题标题】:Implicit class in companion同伴中的隐式类
【发布时间】: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


    【解决方案1】:

    添加一行可以解决问题(您还需要显式导入伴随对象字段):

    object Application{
        import Elsewhere.NamedInt
        import Elsewhere.NamedInt._
    
        // Compiles OK now :)
        val named: NamedInt = 3.named("bob")
    }
    

    【讨论】:

    • 这是我的解决方法,但我认为没有它也可以工作,因为隐含在伴随对象中。已经添加了具有类似功能的更新。
    猜你喜欢
    • 2015-11-13
    • 2016-08-24
    • 2014-02-03
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多