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

发布于 2024-09-16 10:19:16 字数 1424 浏览 10 评论 0原文

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

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

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

[...]

鉴于上述和以下事实:

  1. Long 不是 java.lang.Comparable[Long] 的子类型,即不符合< /strong> 键入 T,其中 T <: java.lang.Comaparable[Long]
  2. Predef 包含 隐式 def longWrapper (x : Long) : RichLong
  3. RichLongjava.lang.Comparable[Long] 的子类型,即符合类型 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 2.8 spec says in section 7.3 (highlighting is mine):

Implicit parameters and methods can also define implicit conversions called views.
A view from type S to type T is defined by an implicit value which has function type
S=>T or (=>S)=>T or by a method convertible to a value of that type.
Views are applied in two situations.

  1. If an expression e is of type T, and T does not conform to the expression’s
    expected type pt. In this case an implicit v is searched which is applicable to
    e and whose result type conforms to pt. The search proceeds as in the case of
    implicit parameters, where the implicit scope is the one of T => pt. If such a
    view is found, the expression e is converted to v(e).

[...]

given the above and the following facts:

  1. Long is not a subtype of java.lang.Comparable[Long], i.e. does not conform to type T where T <: java.lang.Comaparable[Long]
  2. Predef contains implicit def longWrapper (x: Long) : RichLong
  3. RichLong is a subtype of java.lang.Comparable[Long], i.e. conforms to type T where T <: java.lang.Comaparable[Long]

I would expect the implicit conversion to be applied where Long is encountered and a subtype of java.lang.Comparable[Long] is expected. However:

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)
       ^

The result is as expected if the value is converted explicitly:

scala> test(longWrapper(12L))
12

Why isn't the conversion function applied implicitly?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

江南月 2024-09-23 10:19:16

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

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

You need to use a view-bound (<%) to have compiler look for and apply the implicit conversion.

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

You can read more about view-bound on this page (Ctrl+F for "view bound").

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文