Scala函数在列表中丢失变量类型?
背景:
我试图通过动态创建/组合Scala中的匿名函数的部分函数(case …)来减少代码并改进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好奇,我的实际功能有问题,而不是上面的check(): def caseFn[T](fn: T => Unit)(implicit ct: ClassTag[T]): Actor.Receive = { case ct(msg: T) => { fn(msg) } } 解决方法
你可以通过改变来使它工作
val lst = List(fn).map(check) 至 val lst = List(fn).map(check(_)) 这里发生了什么? 在map(check)的情况下,Scala执行所谓的eta-expansion将方法(check)转换为函数,参见Scala Language Specification Version 2.9的6.26.5:
所以在map(check)中,Scala执行eta-expansion并且必须推断泛型方法检查的类型(在eta-expansion期间生成).由于Scala中类型推断的限制,它将推断Nothing而不是String,因此第一个版本不起作用,而第二个版本不起作用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- unix – 使用rsync ssh公钥作为不同于ssh密钥所有者的用户同
- unix – “find command -mtime 0”没有得到我期望的文件
- WebService介绍(WebService基础知识、XFire、CXF(基于XFir
- 将Angular Material2与Bootstrap4 css一起用于网格布局
- docker – 如何从主机访问容器的Web应用程序
- angularjs – 新到角度 – 计算变量
- 在Docker容器中安装node_modules并将它们与host同步
- AngularJS翻译:格式化动态日期
- angularjs – Angular 2 Rc.1路由器未加载“/”组件
- 在Angular 2中刷新Kendo网格