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

问题描述 投票:8回答:1

考虑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”?)默认值?我一直在研究优先级等式,并且使用低优先级的含义,但我还没有创建一些与默认值不明确的东西。

scala implicit
1个回答
-1
投票

是的,是的。

您可以通过创建“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
© www.soinside.com 2019 - 2024. All rights reserved.