Value *不是类型参数Int的成员

时间:2018-01-27 17:30:05

标签: scala

package impatient.mapsAndTups.objects


abstract class UnitConversion {
  def convert[T](x: T): T
}

class Inches2Centimeters extends UnitConversion {
  override def convert[Int](x: Int): Int = x * 100
}

object Conversions extends App {
  val c = new Inches2Centimeters()

  println(c.convert(15))
}

我不明白为什么前面的代码没有编译。我收到了错误:

Error:(9, 46) value * is not a member of type parameter Int
  override def convert[Int](x: Int): Int = x * 100

我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:3)

您已在方法 convert 范围内使用自己的 Int “隐藏”标准类型 Int 。这是因为你定义了 convert 来使用名称为 Int 的参数类型,并且将由调用者(和类型推断)定义。

修复代码的一种方法如下,尽管我不会这样做。

package impatient.mapsAndTups.objects

abstract class UnitConversion {
  def convert[T](x: T): T
}

class Inches2Centimeters extends UnitConversion {
  def convert[T](x: T): T = x match {
    case t: Int => (t * 100).asInstanceOf[T]
  }
}

object Conversions extends App {
  val c = new Inches2Centimeters()

  println(c.convert(15))
}

另请注意,您不需要在具体类中覆盖convert。

相反,我会使用“类型类”数字,如下所示:

package impatient.mapsAndTups.objects

abstract class UnitConversion {
  def convert[T: Numeric](x: T): T
}

class Inches2Centimeters extends UnitConversion {

  def convert[T: Numeric](x: T): T = {
    val n = implicitly[Numeric[T]]
    n.times(n.fromInt(100), x)
  }
}

object Conversions extends App {
  val c = new Inches2Centimeters()

  println(c.convert(15))
}

答案 1 :(得分:0)

我认为,你想要的是在类级别声明类型参数,而不是函数:

selectedOrderTable