我正在学习Scala,以下简单程序让我陷入困境:
class ObjectPrinter[T <: AnyVal](x: T) {
def print(t: T) = { // <--- error here
case Is(i) => println("Integer: " + i)
case Ds(d) => println("Double: " + d)
case _ => println("Default")
}
case class Is(i : Int) extends ObjectPrinter[Int](i);
case class Ds(d: Double) extends ObjectPrinter[Double](d);
}
错误消息如下:
缺少扩展功能的类型参数。一个参数类型 匿名函数必须完全知道。预期的类型是:?
这条消息对我来说完全不清楚。他们是什么意思,缺少类型参数?我认为类型参数在case
之后,如Is(i)
。扩展了什么功能?
UPD: 我想根据作为参数传入的参数类型返回一个函数。
答案 0 :(得分:3)
{
case Is(i) => println("Integer: " + i)
case Ds(d) => println("Double: " + d)
case _ => println("Default")
}
是
的缩写y => y match {
case Is(i) => println("Integer: " + i)
case Ds(d) => println("Double: " + d)
case _ => println("Default")
}
(这是错误所讨论的扩展函数。但是编译器无法告诉您希望y
的类型是什么。
如果这是您想要的,指定类型的最简单方法是
(_: SomeType) match {
case Is(i) => println("Integer: " + i)
case Ds(d) => println("Double: " + d)
case _ => println("Default")
}
但这看起来很奇怪:你既没有x
也没有t
。
答案 1 :(得分:2)
我会通过类型类
来实现它case class ObjectPrinter[T <: AnyVal](x: T)
object ObjectPrinter {
implicit val printInt = new Print[Int] {
override def print(t: ObjectPrinter[Int]): Unit = println("Integer: " + t.x)
}
implicit val printDouble = new Print[Double] {
override def print(t: ObjectPrinter[Double]): Unit = println("Double: " + t.x)
}
def print[T <: AnyVal](t: ObjectPrinter[T])(implicit print: Print[T]) = {
print.print(t)
}
}
trait Print[T <: AnyVal] {
def print(t: ObjectPrinter[T]): Unit
}
或者,这个 - 编译
class ObjectPrinter[T <: AnyVal](x: T) {
def print(t: T): Unit = t match {
case i: Int => println("Integer: " + i)
case d: Double => println("Double: " + d)
case _ => println("Default")
}
case class Is(i : Int) extends ObjectPrinter[Int](i);
case class Ds(d: Double) extends ObjectPrinter[Double](d);
}
(虽然我没有看到任何用法如何使用打印,例如,为什么强制执行t
和x
属于同一类型)
你可能想要实现这样的目标:
class ObjectPrinter[T <: AnyVal](x: T)
object ObjectPrinter {
def print[T <: AnyVal](op: ObjectPrinter[T]): Unit = op match { // <--- error here
case Is(i: Int) => println("Integer: " + i)
case Ds(d: Double) => println("Double: " + d)
case _ => println("Default")
}
}
case class Is(i : Int) extends ObjectPrinter[Int](i)
case class Ds(d: Double) extends ObjectPrinter[Double](d)
object Test extends App {
ObjectPrinter.print(Is(5))
}