Неявное разрешение, выбирающее наиболее конкретный подтип

Может ли кто-нибудь объяснить мне, почему 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 разрешает имплициты?


person David Geirola    schedule 04.07.2019    source источник
comment
Взгляните на рекомендации по неявному приоритету и где scala ищет имплициты.   -  person Luis Miguel Mejía Suárez    schedule 04.07.2019


Ответы (1)


Подтип выигрывает:

Если имеется несколько допустимых аргументов, которые соответствуют типу неявного параметра, будет выбран наиболее конкретный из них с использованием правил разрешения статической перегрузки.

однако функция является контравариантным по типу аргумента, что делает

ScalaNumber => String

подтип

BigDecimal => String

таким образом, ScalaNumber => String является более конкретным. Обратите внимание, что type Serializer[T] = T => String является псевдонимом функционального типа.

person Mario Galic    schedule 04.07.2019
comment
Теперь понятно, но есть ли способ сделать то, что мне нужно? Определить общий сериализатор и определить более конкретный в локальной области? - person David Geirola; 04.07.2019