为什么Scala辅助构造函数中不允许使用类型参数?

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方法.