2013-10-12 95 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