首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >伴内隐类

伴内隐类
EN

Stack Overflow用户
提问于 2013-10-12 08:18:48
回答 1查看 957关注 0票数 2

我想应该能找到伴生的对象。这是怎么回事?

代码语言:javascript
复制
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") 
}

更新:我意识到我可以直接导入隐式类,但是我认为它应该在没有它的情况下编译,因为隐式在伴生对象中。这不需要额外的导入就能工作。

代码语言:javascript
复制
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

杰西·艾查尔在他的博客上发表评论

您混淆了隐式参数解析和隐式对象转换。隐式对象转换具有潜在的危险性,因此通常必须显式地将它们导入作用域。 注意事项是在超类中定义的隐式对象转换,而且(我非常肯定)包对象中的对象转换在作用域中是自动的。

这对我来说是有意义的,但是为什么上面的MyInt示例有效呢?

EN

回答 1

Stack Overflow用户

发布于 2013-10-12 08:42:09

添加一个额外的行修复一些事情(您还需要显式地导入配套对象字段):

代码语言:javascript
复制
object Application{
    import Elsewhere.NamedInt
    import Elsewhere.NamedInt._

    // Compiles OK now :)
    val named: NamedInt = 3.named("bob")
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19332094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档