Неявное разрешение, выбирающее наиболее конкретный подтип - PullRequest
2 голосов
/ 04 июля 2019

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

Почему я не могу определить новый неявный более конкретный в моей локальной области видимости? Как влияет разрешение скалы?

1 Ответ

4 голосов
/ 04 июля 2019

Подтип действительно выигрывает :

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

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

ScalaNumber => String

подтипом

BigDecimal => String

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

...