gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:50:56 25 4
gpt4 key购买 nike

假设我在 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 的类型,但我得到的编译器错误是:

no type parameters allowed here



这只是在 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

我在这里使用了 Numeric typeclass 以获得泛型 toFloat方法。

关于templates - 为什么 Scala 辅助构造函数中不允许使用类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7327030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com