4

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

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

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

[...]

鉴于上述和以下事实:

  1. Long不是 的子类型java.lang.Comparable[Long],即不符合类型TwhereT <: 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)
       ^

如果值被显式转换,结果与预期一致:

scala> test(longWrapper(12L))
12

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

4

1 回答 1

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

您可以在此页面上阅读有关视图绑定的更多信息(Ctrl+F 表示“视图绑定”)。

于 2010-08-27T16:19:59.827 回答