【发布时间】:2017-01-27 15:08:58
【问题描述】:
我有一个带有类型参数的函数,我想知道类型参数是否为Option。我最近阅读了一些关于 scala 中类型类的博文,即this one,所以我想出了这个解决方案:
case class OptionFinder[A](isOption: Boolean)
implicit def notOption[A]: OptionFinder[A] = OptionFinder(false)
implicit def hitOption[A]: OptionFinder[Option[A]] = OptionFinder(true)
def myFunction[A](value: A)(implicit optionFinder: OptionFinder[A]): String = {
if (optionFinder.isOption) {"Found Option!"} else {"Found something else."}
}
这似乎按预期工作:
scala> val x: Option[Int] = Some(3)
scala> myFunction(x)
res0: String = Found Option!
scala> val y: String = "abc"
scala> myFunction(y)
res1: String = Found something else.
在Some(3) 的情况下,hitOption 是隐式参数,即使notOption 也会匹配(A = Option[Int])。显然,更具体的是选择的类型。但是我能保证编译器总是选择更具体的类型吗?无论如何,它在编译器中是如何工作的?我还没有找到有关此行为的文档。
注意:也许这个问题的标题不是最好的,我很乐意将它改成更好的。
【问题讨论】:
-
都在隐式解析中,说不定stackoverflow.com/questions/5598085/…有东西。
-
是的,但是这里两个隐式都在同一个(=当前)范围内。我的问题是:编译器如何在两者之间进行选择?
标签: scala