如何使用更高级别的类型的继承?

时间:2017-02-26 09:27:20

标签: scala inheritance higher-kinded-types

我正在尝试对包含类型参数的类使用继承,但scala编译器无法正确继承类型。

trait Printer[X] {
  def pretty(src : X) : String
}

final case class Higher[P[_] <: Printer[_], X](printer : P[X]) {
  def pass(arg : X) : String = {
    val pr : Printer[X] = printer
    pr.pretty(arg)
  }
}

编译器输出:

InheritanceFailed.scala:23: error: type mismatch;
 found   : P[X]
 required: test.failedinheritance.Inner.Printer[X]

      val pr : Printer[X] = printer
                            ^
one error found

与没有成功编译类型参数的类相反:

trait Printer {
  def pretty(src : Int) : String
}

final case class Higher[P <: Printer](printer : P) {
  def pass(arg : Int) : String = {
    val pr : Printer = printer
    pr.pretty(arg)
  }
}

是否有可能以编译器可理解的方式声明更高级的示例?

1 个答案:

答案 0 :(得分:1)

您必须使用名称而不是通配符来告诉编译器PPrinter的类型参数是相同的。

trait Printer[X] {
  def pretty(src : X) : String
}

final case class Higher[P[Y] <: Printer[Y], X](printer : P[X]) {
  def pass(arg : X) : String = {
    val pr : Printer[X] = printer
    pr.pretty(arg)
  }
}