【问题标题】:Method type returning an object using this.type as a type parameter使用 this.type 作为类型参数返回对象的方法类型
【发布时间】:2013-11-12 22:15:48
【问题描述】:

我有以下记录和 DAO:

abstract class SuperRecord
class Record1 extends SuperRecord
class Record2 extends SuperRecord
abstract class SubRecord extends SuperRecord
class SubRecord1 extends SubRecord

abstract class DAO[T <: SuperRecord] extends scala.slick.driver.MySQLDriver.simple.Table[T]
object DAO1 extends DAO[Record1]
object DAO2 extends DAO[Record2]
abstract class SubDAO extends DAO[T <: SubRecord]
object SubDAO1 extends SubDAO[SubRecord1]

那么SuperRecord和Record有以下方法

abstract class SuperRecord {
  def table: DAO[T] forSome {type T <: SuperRecord}
}

class Record1 extends SuperRecord {
  def table = DAO1
}

所有这些都满足类型检查器。但是,我想更改 SuperRecord 中“def table”的签名以指示 T IS 记录类型,即在 Record1 中表的类型是 DAO[Record1] 而不是 DAO[T :

def table: DAO[this.type]

def table: T forSome {type T <: DAO[U forSome {type U <: this.type }]}

都不满足类型系统。我想在 Scala 中完成的工作是否可行,如果可以,我应该使用什么“表”签名?

【问题讨论】:

  • 第一个替代方案def table: DAO[this.type]有什么问题?
  • @david: 我在Record1 中设置def table = DAO1 时得到的错误是,发现:DAO1.type;必需:DAO[Record1.this.type];注意:Record1 >:Record1.this.type(和 DAO1.type <:dao dao t>
  • 不设置为DAO1,而是设置为def table = new DAO[this.type](""){ def * : ColumnBase[self.type] = ??? }呢?不确定这是否有帮助。

标签: scala types


【解决方案1】:

我认为您可以通过以下方式获得所需的类型特异性级别:

abstract class SuperRecord[T <: SuperRecord[T]] {
  def table: DAO[T]
}
abstract class DAO[T <: SuperRecord[T]] extends Table[T]

允许您定义:

class Record1 extends SuperRecord[Record1] {
  def table = DAO1
}
object DAO1 extends DAO[Record1]

【讨论】:

  • 谢谢,我将把这个问题保留几天,看看是否有人有一个答案,将所有的打字错误都包含在“def table”中(而不是要求我重新-type 我所有的类),除非我接受这个作为解决方案并着手重构
  • 当然——我们都想看看这是否可以做得更好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
  • 2011-01-13
  • 2018-10-19
  • 1970-01-01
  • 2012-05-04
相关资源
最近更新 更多