Компилятор распознает ваши параметры в этих двух случаях как None
и Some
вместо Option
. Сложно иметь неявный экземпляр для «любого А», потому что тогда вы можете довольно часто сталкиваться с этой ситуацией, когда вы ожидаете, что будет использоваться какой-то более конкретный тип c (например, Option[A]
), но случайно вернетесь к неявный для обобщенного типа c (в данном случае A
), и компилятор не может действительно знать, что это не то, что вы хотели.
Итак, это будет работать:
myFunction(Option.empty) must beTrue
myFunction(Option(5)) must beTrue
Это также будет работать:
implicit def hitOption[A]: OptionFinder[Option[A]] = OptionFinder(true)
implicit def hitOptionN: OptionFinder[None.type] = OptionFinder(true)
implicit def hitOptionS[A]: OptionFinder[Some[A]] = OptionFinder(true)
...
myFunction(None) must beTrue
myFunction(Some(5)) must beTrue
Вы можете винить в этом дизайн Option
. Я почти уверен, что каждый Scala разработчик хотя бы раз сталкивался с проблемой «Опция ожидалась, но нашла Некоторые». Если вы построите их, используя empty
и apply
, вы будете в безопасности.