maa*_*kle 12 templates constructor scala
假设我在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...
}
Run Code Online (Sandbox Code Playgroud)
我想用模板将其煮沸,例如:
class Point(x:Float, y:Float) {
this[T](x:T, y:T) = this(x.toFloat, y.toFloat)
}
Run Code Online (Sandbox Code Playgroud)
我知道这无论如何都不会起作用,因为T可能是未定义toFloat的类型,但我得到的编译器错误是:
这里不允许使用类型参数
这只是在Scala中不受支持吗?如果是这样,为什么,有什么简单的方法来解决这个问题?
Kip*_*ros 14
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
Run Code Online (Sandbox Code Playgroud)
在这里,我使用了Numeric类型类来获得泛型toFloat方法.
| 归档时间: |
|
| 查看次数: |
1341 次 |
| 最近记录: |