Scala 为什么从Long到RichLong的隐式转换不适用于预期RichLong的超类型?

Scala 为什么从Long到RichLong的隐式转换不适用于预期RichLong的超类型?,scala,implicit-conversion,Scala,Implicit Conversion,Scala 2.8规范第7.3节(突出显示是我的): 隐式参数和方法还可以定义称为视图的隐式转换。 从类型S到类型T的视图由具有函数类型的隐式值定义 S=>T或(=>S)=>T,或通过可转换为该类型值的方法。 视图应用于两种情况 如果表达式e的类型为T,且T与表达式的类型不一致 应为pt类型。在这种情况下,将搜索适用于 e和其结果类型符合pt。搜索过程与以下情况相同: 隐式参数,其中隐式范围是T=>pt中的一个。如果是这样的话 如果找到视图,表达式e将转换为v(e) [……] 鉴于上述情况和以下

Scala 2.8规范第7.3节(突出显示是我的):

隐式参数和方法还可以定义称为视图的隐式转换。 从类型S到类型T的视图由具有函数类型的隐式值定义 S=>T或(=>S)=>T,或通过可转换为该类型值的方法。 视图应用于两种情况

  • 如果表达式e的类型为T,且T与表达式的类型不一致 应为pt类型。在这种情况下,将搜索适用于 e和其结果类型符合pt。搜索过程与以下情况相同: 隐式参数,其中隐式范围是T=>pt中的一个。如果是这样的话 如果找到视图,表达式e将转换为v(e)
  • [……]

    鉴于上述情况和以下事实:


  • Long
    不是
    java.lang.compariable[Long]
    的子类型,即不符合
    T
    类型,其中
    T需要使用视图绑定(
    def test[T java.lang.compariable[Long])
    scala>测试(12升)
    12
    
    您可以在第页上阅读有关视图绑定的更多信息(Ctrl+F表示“视图绑定”)

    scala> def test[T <: java.lang.Comparable[Long]](c: T) = println(c)
    test: [T <: java.lang.Comparable[Long]](c: T)Unit
    
    scala> test(12L)
    <console>:7: error: inferred type arguments [Long] do not conform to method test's type parameter bounds [T <: java.lang
    .Comparable[Long]]
           test(12L)
           ^
    
    scala> test(longWrapper(12L))
    12
    
    scala> def test[T <% java.lang.Comparable[Long]](c: T) = println(c)
    test: [T](c: T)(implicit evidence$1: (T) => java.lang.Comparable[Long])Unit
    
    scala> test(12L)
    12