为什么在预期的Richlong的超级文字的情况下,从长期到Richlong的隐含转换不应用?

StackOverflow https://stackoverflow.com/questions/3586044

  •  01-10-2019
  •  | 
  •  

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

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

  1. 如果表达式为t型,则t 不符合 表达式的预期类型PT。在这种情况下,搜索隐式v,适用于e和e 其结果类型符合 到pt。搜索如隐式参数一样进行,其中隐式范围是t => pt之一。如果发现了这种观点,则表达式E将转换为V(e)。

[...]

给定上述事实:

  1. Long 不是亚型 java.lang.Comparable[Long], , IE 不符合 输入 T 在哪里 T <: java.lang.Comaparable[Long]
  2. Predef 包含 implicit def longWrapper (x: Long) : RichLong
  3. RichLong 是亚型 java.lang.Comparable[Long], , IE 顺从 输入 T 在哪里 T <: 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

为什么不隐含地应用转换功能?

有帮助吗?

解决方案

您需要使用一个视图(<%)让编译器寻找并应用隐式转换。

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用于“视图绑定”)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top