У меня есть тип F-Bound:Scala: Companion объекты для двукратно типов F-Bounded полиморфных
sealed trait A[AA <: A[AA]] {
self: AA =>
}
И второй F-Bound типа, который параметризованный первый типа.
sealed trait B[BB <: B[BB, AA], AA <: A[AA]] {
self: BB =>
val content: AA
}
Я могу счастливо писать классы случая, что делает использование этих типов:
case class BInst[BB <: BInst[BB, AA], AA <: A[AA]](content: AA)
extends B[BInst[BB, AA], AA]
Теперь я хотел бы иметь объект компаньона для случая класса, который я могу ссылаться через черт B, что-то вроде:
sealed trait A[AA <: A[AA]] { self: AA => }
sealed trait B[BB <: B[BB, AA], AA <: A[AA]] {
self: BB =>
val content: AA
def companion: Companion[BB]
}
case class BInst[BB <: BInst[BB, AA], AA <: A[AA]](content: AA)
extends B[BInst[BB, AA], AA] {
def companion: Companion[BInst[BB, AA]] = BInst
}
sealed trait Companion[+BB <: B[_, _]]
object BInst extends Companion[BInst]
Но это не удается скомпилировать как Бинст в сопутствующем параметризации (последняя строка) требует параметры типа. Аналогичным образом
sealed trait Companion[BB[X, Y] <: B[X, Y]]
не работает. Каков правильный тип для объекта-компаньона?
В чем преимущество литья? – Karalga
В вашем первоначальном фрагменте вы просите «def companion: Companion [BInst [BB, AA]]' - так что если вы в порядке с 'def companion: Companion [_]', тогда нет преимуществ :) – dk14