2013-10-12 96 views
1

我认为会发现伴侣对象中的隐含。这有什么问题?伴侣中的隐式类

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

添加一个额外的行修复的东西(你还需要明确导入的同伴对象字段):

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

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

这是我的解决办法,但我认为它没有因为隐含在同伴对象会工作。已添加更新与类似的东西,工程。 – Pengin