Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 隐式解析选择最特定的子类型_Scala_Implicit_Subtype_Scalac - Fatal编程技术网

Scala 隐式解析选择最特定的子类型

Scala 隐式解析选择最特定的子类型,scala,implicit,subtype,scalac,Scala,Implicit,Subtype,Scalac,有人能解释为什么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{

有人能解释为什么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是如何解析隐式的?

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

然而,函数的参数类型使

ScalaNumber => String
一种

BigDecimal => String

因此,
ScalaNumber=>String
更为具体。请注意,
type Serializer[T]=T=>String
对函数类型进行了别名处理。

查看-和。现在已经很清楚了,但是有一种方法可以实现我需要的功能吗?定义泛型序列化程序并在本地范围中定义更具体的序列化程序?