У меня есть три F-Bound типы A
, B
& C
, где B
параметризовано A
и C
параметризовано B
(и, следовательно, также A
). Я могу создать экземпляр A
и B
, но когда я пытаюсь создать экземпляр C
, компилятор не сможет вывести типы. Если я дам ему типы явно, все работает - но кажется глупым, что эти типы теряются (это из-за стирания типа?).Построение три уровня вложенности F-Bound типы
sealed trait A[AA <: A[AA]] {
self =>
val data: String
}
case class AInst(data: String) extends A[AInst]
sealed trait B[BB <: B[BB, AA], AA <: A[AA]] {
self: BB =>
val content: AA
}
case class BInst[AA <: A[AA]](content: AA) extends B[BInst[AA], AA]
sealed trait C[CC <: C[CC, BB, AA], BB <: B[BB, AA], AA <: A[AA]] {
self: CC =>
val content: BB
}
case class CInst[BB <: B[BB, AA], AA <: A[AA]](content: BB)
extends C[CInst[BB, AA], BB, AA]
val a1 = new AInst("A1")
val b1 = BInst(a1)
val c1 = CInst[BInst[AInst],AInst](b1)
Есть работа вокруг, где я не должен указывать типы для CInst
конкретно?
В настоящее время я использую параметризацию типа для реализации F-Bounds, но будет ли переход на абстрактный тип членов решить эту проблему? Как бы тогда выглядел класс?
У меня был пример здесь: https://stackoverflow.com/questions/1154571/scala-abstract-types-vs-generics/10891994#10891994 – ayvango