为什么在需要RichLong的超类型的情况下,不应用从Long到RichLong的隐式转换?

nar*_*thi 4 scala implicit-conversion

Scala 2.8规范在7.3节中说明(突出显示是我的):

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

  1. 如果表达式e是T类型,并且T 不符合表达式的预期类型pt.在这种情况下,搜索隐式v,适用于e并且其结果类型符合 pt.搜索按照隐式参数的情况进行,其中隐式范围是T => pt.如果找到这样的视图,则表达式e被转换为v(e).

[...]

鉴于以上事项和以下事实:

  1. Long不是子类型java.lang.Comparable[Long],即不符合类型的T地方T <: java.lang.Comaparable[Long]
  2. Predef 包含 implicit def longWrapper (x: Long) : RichLong
  3. RichLong是一个子类型java.lang.Comparable[Long],即符合类型TwhereT <: java.lang.Comaparable[Long]

我希望隐式转换应用于Long遇到的位置和java.lang.Comparable[Long]预期的子类型.然而:

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)
       ^
Run Code Online (Sandbox Code Playgroud)

如果显式转换值,结果如预期:

scala> test(longWrapper(12L))
12
Run Code Online (Sandbox Code Playgroud)

为什么隐式应用转换函数?

mis*_*tor 5

您需要使用视图绑定(<%)来编译器查找并应用隐式转换.

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
Run Code Online (Sandbox Code Playgroud)

您可以在页面上阅读有关视图限制的更多信息(Ctrl + F表示"视图绑定").