3
Я переводим некоторые параметризованные типы F-Bounded в классы абстрактного типа. Оригинальные классы были:Унаследованный абстрактный тип в случае класса конструктор класса
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 A2 {
self =>
type AA <: A2 {type AA = self.AA}
val data: String
}
case class A2Inst(data: String) extends A2
sealed trait B2 {
self =>
type BB <: A2 {type BB = self.BB}
type AA <: A2 {type AA = self.AA}
val content: AA
}
case class B2Inst[AHere <: A2 {type AA = AHere}](content: AHere) extends B2 {
self =>
type AA = AHere
}
val a2 = A2Inst("A2")
val b2 = B2Inst(a2)
К сожалению B2Inst
не компилируется. Какое правильное определение для класса case?
ой дорогой, плохо мне! есть ли другой способ написать параметр типа для «B2Inst» или «AHere <: A2 {type AA = AHere}» единственный способ? – Karalga
Не то, чтобы я мог думать. Поскольку для определения типа из переданного параметра необходимо указать тип уточнения. Я полагаю, вы могли бы определить псевдоним типа (внешний), например: 'type CC [C] = A2 {type AA = C}', а затем использовать его следующим образом: 'case class B2Inst [AHere <: CC [AHere]] (контент : AHere) '. Я не уверен, что я бы назвал это лучше, тем более, что вопрос заключается в том, чтобы избежать F-ограниченного синтаксиса. –