value-不是类型参数T | Scala Error的成员

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

我使用的是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 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
可以在这里使用(尽管我更喜欢命名参数)。