создать неоднозначный неявный низкий приоритет - PullRequest
9 голосов
/ 01 апреля 2019

Рассмотрим кодек по умолчанию, предлагаемый в пакете io.

implicitly[io.Codec].name  //res0: String = UTF-8

Это неявный "низкий приоритет", поэтому его легко переопределить без неоднозначности.

implicit val betterCodec: io.Codec = io.Codec("US-ASCII")

implicitly[io.Codec].name  //res1: String = US-ASCII

Этотакже легко повысить уровень приоритета.

import io.Codec.fallbackSystemCodec
implicit val betterCodec: io.Codec = io.Codec("US-ASCII")

implicitly[io.Codec].name  //won't compile: ambiguous implicit values

Но можем ли мы пойти в противоположном направлении?Можем ли мы создать неявный низкий уровень, который отключает («неоднозначно») значение по умолчанию?Я смотрел на уравнение приоритета и играл с последствиями низкого приоритета, но мне еще предстоит создать нечто неоднозначное по умолчанию.

1 Ответ

0 голосов
/ 02 апреля 2019

Вроде да.

Вы можете сделать это, создав новый тип.Т.е. тип, который является просто прокси для io.Codec и оборачивает экземпляр.Это означает, что вам также нужно изменить все ваши неявные аргументы с io.Codec на CodecWrapper, что может быть невозможно.

trait CodecWraper {
  def orphan: io.Codec
}

object CodecWrapper {
  /* because it's in the companion, this will have the highest implicit resolution priority. */
  implicit def defaultInstance: CodecWrapper = 
    new CodecWrapper {
      def orphan = new io.Codec { /* your default implementation here */ }
    }
  }
}

import io.Codec.fallbackSystemCodec
implicitly[CodecWrapper].orphan // io.Codec we defined above - no ambiguity
...