2015-04-16 5 views
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?

ответ

3

Вам не указан тип уточнения в определении A2Inst.

case class A2Inst(data: String) extends A2 { type AA = A2Inst } 

Все вместе:

sealed trait A2 { 
    self => 
    type AA <: A2 {type AA = self.AA} 
    val data: String 
} 
case class A2Inst(data: String) extends A2 { type AA = A2Inst } 

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) 

// Exiting paste mode, now interpreting. 

defined trait A2 
defined class A2Inst 
defined trait B2 
defined class B2Inst 
a2: A2Inst = A2Inst(A2) 
b2: B2Inst[A2Inst] = B2Inst(A2Inst(A2)) 
+0

ой дорогой, плохо мне! есть ли другой способ написать параметр типа для «B2Inst» или «AHere <: A2 {type AA = AHere}» единственный способ? – Karalga

+0

Не то, чтобы я мог думать. Поскольку для определения типа из переданного параметра необходимо указать тип уточнения. Я полагаю, вы могли бы определить псевдоним типа (внешний), например: 'type CC [C] = A2 {type AA = C}', а затем использовать его следующим образом: 'case class B2Inst [AHere <: CC [AHere]] (контент : AHere) '. Я не уверен, что я бы назвал это лучше, тем более, что вопрос заключается в том, чтобы избежать F-ограниченного синтаксиса. –

Смежные вопросы