考虑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
但我们可以走向相反的方向吗?我们可以创建一个低级隐式,禁用(“ambiguates”?)默认值?我一直在研究优先级等式,并且使用低优先级的含义,但我还没有创建一些与默认值不明确的东西。
是的,是的。
您可以通过创建“newtype”来完成此操作。即一种类型,它只是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