我已经看过这种解决方案在过去的工作,所以我不确定我做错了什么。考虑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 beTrue
和myFunction(Some(5)) must beTrue
均失败
我在做什么错?
我已经看过这种解决方案在过去的工作,所以我不确定我做错了什么。考虑一下scala中的类解析如何工作的答案?从中我执行了以下代码:import org.specs2 ....
编译器在这两种情况下将您的参数识别为None
和Some
,而不是Option
。拥有“任何A”的隐式实例是很棘手的,因为这样一来,您可能经常会遇到这种情况,因为您希望使用某些更特定的类型(例如Option[A]
),但是您不小心回到了隐式通用类型(在这种情况下为A
),并且编译器无法真正知道这不是您想要的。