Scala子类型参数

时间:2016-10-21 14:51:10

标签: scala

我创建了一个扩展Project

的课程Model
abstract class Model
case class Project(...) extends Model

和对象Table扩展Base

abstract class Base {
    val tableForm: Form[Model]
}

object Table extends Base {
    val tableForm: Form[Project] = (...)
}

为什么它不能编译,我该如何解决? (“在类的基类中覆盖方法/值tableForm => Form [Model]”

我只想强制Base的所有子类都具有tableForm属性。

1 个答案:

答案 0 :(得分:4)

因为Form[Project]不是Form[Model]的子类。因此,编译器会在覆盖值时抱怨不兼容的类型。

Form[T]是不变的。您可以阅读variance doc

要解决此问题,您可以将类型参数添加到Base

abstract class Base[M <: Model] {
  val tableForm: Test[M]
}

object Table extends Base[Project] {
  val tableForm: Test[Project] = ???
}