Scala类型类解析度

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

我已经看过这种解决方案在过去的工作,所以我不确定我做错了什么。考虑How does type class resolution in scala work?的答案>

出于这个,我做了这段代码:

import org.specs2.mutable.Specification

case class OptionFinder[A](isOption: Boolean)

object OptionFinder extends LowerPriority {
  implicit def hitOption[A]: OptionFinder[Option[A]] = OptionFinder(true)
}

trait LowerPriority {
  implicit def notOption[A]: OptionFinder[A] = OptionFinder(false)
}

object OptionFinderSpec extends Specification {
  "OptionFinder" should {

    "find Options" in {
      def myFunction[A](value: A)(implicit optionFinder: OptionFinder[A]): Boolean = {
        optionFinder.isOption
      }

      myFunction(5) must beFalse
      myFunction(None) must beTrue
      myFunction(Some(5)) must beTrue
    }
  }
}

据我了解,所有测试均应通过。由于某些原因myFunction(None) must beTruemyFunction(Some(5)) must beTrue均失败

我在做什么错?

我已经看过这种解决方案在过去的工作,所以我不确定我做错了什么。考虑一下scala中的类解析如何工作的答案?从中我执行了以下代码:import org.specs2 ....

scala implicit
1个回答
0
投票

编译器在这两种情况下将您的参数识别为NoneSome,而不是Option。拥有“任何A”的隐式实例是很棘手的,因为这样一来,您可能经常会遇到这种情况,因为您希望使用某些更特定的类型(例如Option[A]),但是您不小心回到了隐式通用类型(在这种情况下为A),并且编译器无法真正知道这不是您想要的。

© www.soinside.com 2019 - 2024. All rights reserved.