虽然在技术上这是可能的:
type Handled[S, R] = S => R
def defaultHandled[S, R](x: S): R = x.asInstanceOf[R]
def myFunc[S, R](value: S, handled: Handled[S, R] = defaultHandled[S, R] _): R = {
handled(value)
}
myFunc[Int, Int](1)
这不是类型安全的,通常不是一个好主意。例如,如果您尝试使用不同的类型参数调用myFunc,同时仍然依赖默认的handled 值,您将得到运行时异常:
myFunc[Int, String](1)
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
Scala 解决这个问题的方法是作为隐式参数处理。在这种情况下,您可以提供编译器可能使用的默认实现。
type Handled[S, R] = S => R
implicit def defaultHandled[S]: Handled[S, S] = identity
def myFunc[S, R](value: S)(implicit handled: Handled[S, R]): R = {
handled(value)
}
myFunc(1) // compiles and works
myFunc[Int, String](1) // compilation error: Error:(11, 21) No implicit view
// available from Int => String.
//myFunc[Int, String](1)
// ^