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不是专门的,你不能进一步去。 嗯…你可以编写自己的数字并专门化,但是,在这一点上,我不知道你是通过使类参数化在第一位获得的。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |