value-不是类型参数T | Scala Error的成员
我使用的是Scala 2.13。 我编写了以下代码,表示仅适用于scala.math.Numeric类型的二维点:value-不是类型参数T | Scala Error的成员,scala,generics,Scala,Generics,我使用的是Scala 2.13。 我编写了以下代码,表示仅适用于scala.math.Numeric类型的二维点: class Point[T: Numeric](val x: T, val y: T) { def getDistance(otherPoint: Point[T]): Double = { math.sqrt(math.pow(otherPoint.x - x, 2) + math.pow(otherPoint.y - y, 2)) } override
class Point[T: Numeric](val x: T, val y: T) {
def getDistance(otherPoint: Point[T]): Double = {
math.sqrt(math.pow(otherPoint.x - x, 2) + math.pow(otherPoint.y - y, 2))
}
override def toString = "(" + x + "," + y + ")"
}
在第4行中,我得到错误“value-不是类型参数T的成员”,单击查看错误发生的位置:
我哪里出了问题?(我不熟悉泛型,在scala中键入边界)首先,您需要一个额外的
导入
,以便在数字
上启用方便的符号操作
然后,输入它理解的参数类型
class Point[T: Numeric](val x: T, val y: T) {
import Numeric.Implicits._
def getDistance(otherPoint: Point[T]): Double = {
math.sqrt(math.pow((otherPoint.x - x).toDouble, 2) +
math.pow((otherPoint.y - y).toDouble, 2))
}
override def toString = "(" + x + "," + y + ")"
}
首先,您需要额外的
导入
,以便在数字
上启用方便的符号操作
然后,输入它理解的参数类型
class Point[T: Numeric](val x: T, val y: T) {
import Numeric.Implicits._
def getDistance(otherPoint: Point[T]): Double = {
math.sqrt(math.pow((otherPoint.x - x).toDouble, 2) +
math.pow((otherPoint.y - y).toDouble, 2))
}
override def toString = "(" + x + "," + y + ")"
}
问题1:
要使用给定数值界的数学运算符,您需要
import Numeric.Implicits._
(和分数/整数.Implicits.
以获得除法运算)。没有它,你需要做一些像
Numeric[T].minus(otherPoint.x, x)
或者为隐式数值参数指定名称,而不是使用上下文绑定。通过导入,您可以只编写
otherPoint.x - x
导入可以在任何范围内声明:通常在文件的顶部,但如果只需要一次,它可以进入方法内部
问题2:
math.pow
仅适用于Double
,标准库中的所有Numeric
没有等效函数。因此,使用toDouble
方法将其转换为Double
(您可以定义一个通用的平方函数,但不是真正的平方根)。问题1:
要使用给定数值界的数学运算符,您需要
import Numeric.Implicits._
(和分数/整数.Implicits.
以获得除法运算)。没有它,你需要做一些像
Numeric[T].minus(otherPoint.x, x)
或者为隐式数值参数指定名称,而不是使用上下文绑定。通过导入,您可以只编写
otherPoint.x - x
导入可以在任何范围内声明:通常在文件的顶部,但如果只需要一次,它可以进入方法内部
问题2:
math.pow
仅适用于Double
,标准库中的所有Numeric
没有等效函数。因此,使用toDouble
方法将其转换为Double
(您可以定义一个通用的平方函数,但不是真正的平方根)。请正确设置代码的格式。@cchantep,我已经设置了代码的格式。谢谢请正确格式化您的代码。@cchantep,我已经格式化了代码。谢谢如果您以这种方式使用toDouble
(而不是例如(otherPoint.x-x).toDouble
),则t
上不再有运算符,也不需要导入。实际上,这并不完全正确。如果没有导入,我们无法对原始的数值执行double
。当然,如果我们有ev
,我们可以做ev.toDouble(x)
。(该死的上下文限制!;o)哦,对了,对不起。“当然我们可以做ev.toDouble(x),如果我们有ev”Numeric.apply
可以在这里使用(尽管我更喜欢命名参数)。如果你这样使用toDouble
(而不是(otherPoint.x-x)。toDouble
),在t
上不再有运算符,也不需要导入。实际上,这并不完全正确。如果没有导入,我们无法对原始的数值执行double
。当然,如果我们有ev
,我们可以做ev.toDouble(x)
。(该死的上下文限制!;o)哦,对了,对不起。“当然我们可以使用ev.toDouble(x),如果我们有ev”Numeric.apply
可以在这里使用(尽管我更喜欢命名参数)。