【问题标题】:Implicit resolution choosing the most specific subtype隐式解析选择最具体的子类型
【发布时间】:2019-07-04 17:49:24
【问题描述】:

有人可以解释一下为什么 scala 解决了最通用的隐式,而不管本地范围的隐式更具体吗?

例子:

import scala.math.ScalaNumber

type Serializer[T] = T => String

object SerializedOps{
  implicit class AnyOps[T](t: T){
    def serialize(implicit s: Serializer[T]) : String = s(t)
  }
}

object Instances{
  implicit val scalaNumber : Serializer[ScalaNumber] = _.toString + "_DEFAULT"
}


import SerializedOps._
import Instances._


implicit val bigDecimalCustom : Serializer[BigDecimal] = _.toString + "_CUSTOM"

val res: String = BigDecimal(100).serialize
//res: String = 100DEFAULT

为什么我不能在我的本地范围内定义一个新的更具体的隐式? scala 如何解析隐含?

【问题讨论】:

标签: scala implicit subtype scalac


【解决方案1】:

Subtype does win:

如果有多个符合条件的参数与隐式匹配 参数的类型,将使用规则选择最具体的类型 静态重载决议。

然而函数的参数类型是contravariant,这使得

ScalaNumber => String

一个子类型

BigDecimal => String

因此ScalaNumber => String 更具体。注意type Serializer[T] = T => String 是一个函数类型的别名。

【讨论】:

  • 现在很清楚了,但是有办法做我需要的吗?定义一个通用序列化器并在本地范围内定义一个更具体的序列化器?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 2021-01-07
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
相关资源
最近更新 更多