加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何定义一个适用于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 =>很慢.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读