【发布时间】:2015-08-28 06:44:37
【问题描述】:
背景:
我正在尝试通过从 Scala 中的匿名函数动态创建/组合部分函数(案例...)来减少代码并改进 Akka 中的代码重用。
要创建这些部分函数,我需要访问函数的参数类型(使用类型参数 T),但不幸的是,这会受到类型擦除的影响。
我发现使用TypeTags 或TypeClasses 可以解决这个问题,这很棒。但是,我不想一次将我的函数转换为部分函数,而是使用.map() 批量执行此操作。
但是,这似乎失败了;通过地图使用该功能时,似乎 T 突然变成了Nothing,从而使我的功能功能失调(不是双关语)。
TL;DR:我可以让 lst(0) 也给 String 吗?
import scala.reflect.ClassTag
def fn = (s: String) => {}
def check[T](fn: T => Unit)(implicit ct: ClassTag[T]) = ct
check(fn)
//scala.reflect.ClassTag[String] = java.lang.String
val lst = List(fn).map(check)
lst(0)
//scala.reflect.ClassTag[Nothing] = Nothing
对于Akka-curious,我的实际功能有问题,而不是上面的check():
def caseFn[T](fn: T => Unit)(implicit ct: ClassTag[T]): Actor.Receive = {
case ct(msg: T) => {
fn(msg)
}
}
【问题讨论】:
标签: scala generics akka type-erasure