如何告诉Scala def返回TypeRef [this.type]

时间:2014-03-22 16:28:04

标签: scala types

我有一组如下对象:

abstract class RecordType[T <: Record]
object RecordType1 extends RecordType[Record1]
object RecordType2 extends RecordType[Record2]
...

我想以下列方式使用它们,即每个RecordX都有def recordType: RecordType[RecordX],但我无法弄清楚正确的语法(假设这是可能的):

abstract class Record {
  def recordType: RecordType[this.type]
}
class Record1 extends Record {
  override def recordType: RecordType[Record1] = RecordType1
}
class Record2 extends Record {
  override def recordType: RecordType[Record2] = RecordType2
}
...

这会产生覆盖方法具有不兼容类型的错误。

我已尝试以下作为起点/妥协

abstract class Record {
  def recordType[T <: Record]: RecordType[T]
}
class Record1 extends Record {
  override def recordType: RecordType[Record1] = RecordType1
}

但这会产生错误

type mismatch;
[error]  found   : RecordType1.type
[error]  required: RecordType[Record1]

有没有办法实现第一个目标,即要求每个Subclass返回RecordType[Subclass],或者禁止有办法修复第二组代码?

2 个答案:

答案 0 :(得分:2)

您的解决方案是解决此问题的标准方法之一。另一种是使用类型成员:

abstract class Record {
  type ThisType <: Record

  def recordType: RecordType[ThisType]
}

class Record1 {
  type ThisType = Record1

  override def recordType: RecordType[Record1] = RecordType1
}

答案 1 :(得分:0)

我想我可能找到了解决方案:

abstract class RecordType[T <: Record[T]]
object RecordType1 extends RecordType[Record1]

abstract class Record[T <: Record[T]] {
  def recordType: RecordType[T]
}
class Record1 extends Record[Record1] {
  override def recordType: RecordType[Record1] = RecordType1
}