创建一个含糊的低优先级隐式

jwv*_*wvh 10 scala implicit scala-macros scala-compiler

考虑io包装中提供的默认编解码器。

implicitly[io.Codec].name  //res0: String = UTF-8
Run Code Online (Sandbox Code Playgroud)

它是“低优先级”隐式的,因此很容易覆盖而不会产生歧义。

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

implicitly[io.Codec].name  //res1: String = US-ASCII
Run Code Online (Sandbox Code Playgroud)

提高优先级也很容易。

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

implicitly[io.Codec].name  //won't compile: ambiguous implicit values
Run Code Online (Sandbox Code Playgroud)

但是我们可以朝相反的方向前进吗?我们可以创建一个低级别的隐式来禁用(“歧义化”)默认值吗?我一直在研究优先级方程式,并使用低优先级隐式变量进行操作,但尚未创建默认值的歧义。

Luc*_*ano -1

有点,是的。

您可以通过创建“新类型”来做到这一点。即一种类型,它只是 的代理io.Codec,并包装实例。这意味着您还需要将所有隐式参数从 更改io.CodecCodecWrapper,这可能是不可能的。

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
Run Code Online (Sandbox Code Playgroud)