我正在尝试对包含类型参数的类使用继承,但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)
}
}
是否有可能以编译器可理解的方式声明更高级的示例?
答案 0 :(得分:1)
您必须使用名称而不是通配符来告诉编译器P
和Printer
的类型参数是相同的。
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)
}
}