如何定义一个适用于Scala中不相关类型的函数?
发布时间:2020-12-16 08:53:10 所属栏目:安全 来源:网络整理
导读:我想定义一个将* 2应用于其参数的函数,该函数适用于有意义的所有类型.我尝试使用结构类型: import scala.language.reflectiveCallsdef double[T](x: Any{def * (arg0: Int): T}) = x * 2 它适用于字符串: scala double("a")res85: String = aa 但不是数字
我想定义一个将* 2应用于其参数的函数,该函数适用于有意义的所有类型.我尝试使用结构类型:
import scala.language.reflectiveCalls def double[T](x: Any{def * (arg0: Int): T}) = x * 2 它适用于字符串: scala> double("a") res85: String = aa 但不是数字: scala> double(4) java.lang.NoSuchMethodException: java.lang.Integer.$times(int) at java.lang.Class.getMethod(Class.java:1778) at .reflMethod$Method1(<console>:18) at .double(<console>:18) ... 32 elided >为什么我收到此错误消息? 编辑:通过“做我想要的”我的意思是为现有的类型工作,例如数字和字符串,而不仅仅是我自己定义的类. 解决方法
> *被翻译为$times,结构类型检查*方法的存在,但(我认为这是一个错误)调用它的内部($times)表示).这适用于String,因为它们有$times.
>此方法适用于名称仅包含字母的方法. “` import scala.language.reflectiveCalls def double[T](x: Any{def test (arg0: Int): T}) = x.test(2) class A { def test(i: Int) = i * 10 } class B { def test(i: Int) = i * 20 } scala> double(new A) res0: Int = 20 scala> double(new B) res1: Int = 40 >是的,惯用的答案是类型.你选择什么是“有意义”.它们可以应用于任何已有的类: “` trait Multiply[A]{ def times(a: A,x: Int): A } implicit val MultString = new Multiply[String] { def times(a: String,x: Int) = a * x } implicit val MultInt = new Multiply[Int] { def times(a: Int,x: Int) = a * x } def double[T](t: T)(implicit mult: Multiply[T]) = mult.times(t,2) scala> double("aaaa") res0: String = aaaaaaaa scala> double(111) res1: Int = 222 另请注意,结构类型使用reflection =>很慢. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- angularjs – 如何使用Angular Material动态创建基于JSON的
- Tomcati下使用webservice报错
- bootstrap-不良效果层叠进度条
- 解决WebService 测试窗体只能用于来自本地计算机的请求
- 7.1 安装软件包的三种方法 7.2 rpm包介绍 7.3 rpm工具用法
- Bootstrap框架,在使用栅格布局的时候,在父标签中添加row类
- scala – 用于java可执行jar的SBT项目
- attributes – 在AngularDart中包含mustache指令时,NgAttr值
- angularjs – 错误:[ngModel:nonassign]表达式是不可分配
- angularjs-$location