模板 – 为什么Scala辅助构造函数中不允许使用类型参数?
发布时间:2020-12-16 09:01:45 所属栏目:安全 来源:网络整理
导读:说我在 Scala中定义一个简单的2D点类,我想要能够用各种类型构造它: class Point(x:Float,y:Float) { this(x:Double,y:Double) = this(x.toFloat,y.toFloat) this(x:Int,y:Int) = this(x.toFloat,y.toFloat) // etc...} 我想使用一个模板来打开它,比如: cla
说我在
Scala中定义一个简单的2D点类,我想要能够用各种类型构造它:
class Point(x:Float,y:Float) { this(x:Double,y:Double) = this(x.toFloat,y.toFloat) this(x:Int,y:Int) = this(x.toFloat,y.toFloat) // etc... } 我想使用一个模板来打开它,比如: class Point(x:Float,y:Float) { this[T](x:T,y:T) = this(x.toFloat,y.toFloat) } 我知道这将无法正常工作,因为T可能是一个没有定义toFloat的类型,但我得到的编译器错误是:
这是否在Scala中不受支持?如果是这样,为什么,有没有简单的方法来解决这个问题? 解决方法
Scala的类构造函数(不像Java的)不能使用类型参数,只有类本身可以.至于为什么Scala做出这样的设计选择,我认为主要原因是简单.
如果您想要一个通用的辅助“构建器”方法,那么自然要做的就是在伴随对象上定义它.例如, object Point { def build[T : Numeric](x: T,y: T) = { val n = implicitly[Numeric[T]] new Point(n.toFloat(x),n.toFloat(y)) } } class Point(val x:Float,val y:Float) val p = Point.build(1,2) // Companion object's builder p.x + p.y 这里我使用数字类型类来获取一个通用的toFloat方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |