(斯卡拉2.11.8)继承和自递归类型推断
我有复杂的自递归型签名的性状GenTableLike
限定用于级联兼容表实现方法++
。我也有一个层次GenTableLike >: KeyTable >: MapKeyTable
。但是,++
'两个MapKeyTable
未能推断自递归类型。
这里的有些简单的代码片段中,问题依然再现:
trait GenTableLike[RKT,
CKT,
+A,
+SelfType[+A2] <: GenTableLike[RKT, CKT, A2, SelfType, TransposedType],
+TransposedType[+A2] <: GenTableLike[CKT, RKT, A2, TransposedType, SelfType]] {
def ++[B >: A,
T2 <: GenTableLike[RKT, CKT, B, ST, TT],
ST[+A2] <: GenTableLike[RKT, CKT, A2, ST, TT],
TT[+A2] <: GenTableLike[CKT, RKT, A2, TT, ST]](that: T2): SelfType[B] = ???
}
trait KeyTable[RKT, CKT, +A]
extends GenTableLike[RKT,
CKT,
A,
KeyTable.Curried[RKT, CKT]#Self,
KeyTable.Curried[CKT, RKT]#Self]
object KeyTable {
/** Type helper for defining self-recursive type */
type Curried[RKT, CKT] = {
type Self[+A] = KeyTable[RKT, CKT, A]
}
}
class MapKeyTable[RKT, CKT, +A]
extends KeyTable[RKT, CKT, A]
with GenTableLike[RKT,
CKT,
A,
MapKeyTable.Curried[RKT, CKT]#Self,
MapKeyTable.Curried[CKT, RKT]#Self]
object MapKeyTable {
/** Type helper for defining self-recursive type */
type Curried[RKT, CKT] = {
type Self[+A] = MapKeyTable[RKT, CKT, A]
}
}
val t1: MapKeyTable[Int, String, Int] = ???
val t2: MapKeyTable[Int, String, Any] = ???
// The following works
t1.++[Any, MapKeyTable[Int, String, Any], ({ type ST[+A2] = MapKeyTable[Int, String, A2] })#ST, ({ type TT[+A2] = MapKeyTable[String, Int, A2] })#TT](t2)
t1.++[Any, MapKeyTable[Int, String, Any], MapKeyTable.Curried[Int, String]#Self, MapKeyTable.Curried[String, Int]#Self](t2)
// Error: inferred type arguments [Int,MapKeyTable[Int,String,Any],Nothing,Nothing] do not conform to method ++'s type parameter bounds [B >: Int,T2 <: GenTableLike[Int,String,B,ST,TT],ST[+A2] <: GenTableLike[Int,String,A2,ST,TT],TT[+A2] <: GenTableLike[String,Int,A2,TT,ST]]
t1 ++ t2
难道我做错了什么吗?
备注:
自我类型和转置类型用于定义函数返回类型。我也有一个IndexedTable实现如下定义,所以我不能返工自行式接受3个参数
trait IndexedTable[+A]
extends GenTableLike[Int,
Int,
A,
IndexedTable,
IndexedTable]
class IndexedSeqTable[+A]
extends IndexedTable[A]
with GenTableLike[Int,
Int,
A,
IndexedSeqTable,
IndexedSeqTable]
的也许一个https://github.com/slamdata/matryoshka https://www.youtube.com/watch?v=rBmx9NsNSXM&t=1975s https://开头tpolecat.github.io/2013/10/12/typeclass.html可能会有所帮助。 – Reactormonk