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.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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
421 次 |
| 最近记录: |