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
我该怎么做才能解决这个问题?
答案 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