【发布时间】: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] = ??? }呢?不确定这是否有帮助。