Ant*_*tek 2 generics scala default-value
我的函数获取另一个函数(将输入类型映射到输出类型)作为参数:
type Handled[S,R] = S => R
def myFunc[S,R](value: S, handled: Handled[S,R] = defaultHandled): R = {
handled(value)
}
Run Code Online (Sandbox Code Playgroud)
我需要编写defaultHandled函数,它将获取输入类型并按原样返回.
因此,默认情况下,我想将输入类型映射到输出类型,其中输入类型与输出类型相同.此函数应该简单地将输入传递给任何输入类型的输出.怎么做?
虽然从技术上讲这是可能的:
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)
Run Code Online (Sandbox Code Playgroud)
它不是类型安全的,通常不是一个好主意.例如,如果您尝试myFunc使用不同的类型参数进行调用,同时仍依赖于默认handled值,则会出现运行时异常:
myFunc[Int, String](1)
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
Run Code Online (Sandbox Code Playgroud)
解决这个问题的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)
// ^
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
173 次 |
| 最近记录: |