Scala 为什么从Long到RichLong的隐式转换不适用于预期RichLong的超类型?
Scala 2.8规范第7.3节(突出显示是我的): 隐式参数和方法还可以定义称为视图的隐式转换。 从类型S到类型T的视图由具有函数类型的隐式值定义 S=>T或(=>S)=>T,或通过可转换为该类型值的方法。 视图应用于两种情况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) [……] 鉴于上述情况和以下
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