【发布时间】:2019-08-23 00:58:18
【问题描述】:
考虑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
但是我们可以朝相反的方向走吗?我们可以创建一个禁用(“歧义”?)默认值的低级隐式吗?我一直在研究优先级方程式并使用低优先级隐式进行处理,但我还没有创建一些与默认值不明确的东西。
【问题讨论】:
-
假设您的意思是“消除歧义”?否则不会编译?即你想创建一个新的'deafult'隐式确实编译,对吧?
-
不完全。我想以与
fallbackSystemCodec相同的低优先级创建一个伪隐式,以便所有需要隐式编解码器的代码 将 中断(不会编译),除非更高优先级的隐式在范围内。较高优先级的隐式很容易,但我无法创建一个具有相同优先级的隐式(因此与后备编解码器有歧义)。 -
我认为您混淆了优先级/搜索顺序与范围内的多个隐含。隐式是“低优先级”还是“高优先级”都没有关系。只要作用域内隐含的不止一个,编译器就会报错。
-
但这就是我想要的。我想要编译器抱怨。我想写一个不会编译的隐式,因为它与
fallbackSystemCodec有歧义,但是在不导入fallbackSystemCodec的情况下执行此操作,因为它已经在范围内,不是吗? -
一般来说,我不太明白这会对您有什么帮助。假设您实现了这种行为。那么你如何“修复”你的程序?您不能删除
io.Codec.fallbackSystemCodec(因为它是标准库的一部分)。而且由于您的“冲突”隐式未显式导入,因此您也无法删除它。我理解正确吗?
标签: scala implicit scala-macros scala-compiler