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

scala – 如何使所有数字类型的类通用?

发布时间:2020-12-16 09:40:44 所属栏目:安全 来源:网络整理
导读:我正在尝试创建一个通用的所有数字类型的Vector类。 我原来的尝试是为所有类型写一个类,如下所示: class Vector3f(val x:Float,val y:Float,val z:Float) 由于scala支持专门的注释,我可以使用这个来为所有数字类型生成这些类 class Vector3[A : What?](va
我正在尝试创建一个通用的所有数字类型的Vector类。
我原来的尝试是为所有类型写一个类,如下所示:

class Vector3f(val x:Float,val y:Float,val z:Float)

由于scala支持专门的注释,我可以使用这个来为所有数字类型生成这些类

class Vector3[A <: What?](val x:A,val y:A,val z:A)

但是我发现一个超级类型的数字是AnyVal,但AnyVal不支持 – * /。那么这样做的正确方法是什么,但不牺牲未装箱号码类型的表现?

解决方法

你不行不是现在。也许当,如果,数字得到专业。

说你可以得到最简单的参数化类:

class Vector3[@specialized T](val x: T,val y: T,val z: T)(implicit num: Numeric[T]) {
    def +(other: Vector3[T]) = new Vector3(num.plus(x,other.x),num.plus(y,other.y),num.plus(z,other.z))
}

该方法将编译成大致如下的东西:

override <specialized> def +$mcD$sp(other: Vector3): Vector3 = new Vector3$mcD$sp(
  scala.Double.unbox(
    Vector3$mcD$sp.this.Vector3$$num.plus(
      scala.Double.box(Vector3$mcD$sp.this.x()),scala.Double.box(other.x$mcD$sp()))),scala.Double.unbox(
    Vector3$mcD$sp.this.Vector3$$num.plus(
      scala.Double.box(Vector3$mcD$sp.this.y()),scala.Double.box(other.y$mcD$sp()))),scala.Double.unbox(
    Vector3$mcD$sp.this.Vector3$$num.plus(
      scala.Double.box(Vector3$mcD$sp.this.z()),scala.Double.box(other.z$mcD$sp()))),Vector3$mcD$sp.this.Vector3$$num);

这是scalac -optimize -Xprint:jvm输出。现在,每个专门的类型都有子类,所以你可以初始化一个Vector3而不需要打包,但是只要Numeric不是专门的,你不能进一步去。

嗯…你可以编写自己的数字并专门化,但是,在这一点上,我不知道你是通过使类参数化在第一位获得的。

(编辑:李大同)

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

    推荐文章
      热点阅读