如果在 type 存在的情况下遇到一个有趣的情况,即 thunk 与函数Nothing
:
object Test {
def apply(thunk: => Any ): String => Any = _ => thunk
def apply(fun: String => Any): String => Any = fun
}
val res0 = Test { println("hello") }
res0("foo") // --> hello
val res1 = Test { x: String => println(s"hello $x") }
res1("foo") // --> hello foo
val res2 = Test { x: String => throw new RuntimeException("ex") }
util.Try(res2("foo")) // --> Failure
val res3 = Test { throw new RuntimeException("ex") } // boom!
现在棘手的一点是最后一种情况。是否可以修改apply
方法以使 Scala 选择它的 thunk 版本,而不是Function1
版本(更具体,因此更受欢迎Nothing <: Function1[_,_]
,因此......)
我试图提出低优先级的隐含和磁铁模式,但还没有找到解决方案。