带泛型类型的默认函数参数

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函数,它将获取输入类型并按原样返回.

因此,默认情况下,我想将输入类型映射到输出类型,其中输入类型与输出类型相同.此函数应该简单地将输入传递给任何输入类型的输出.怎么做?

Aiv*_*ean 5

虽然从技术上讲这是可能的:

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)