Question

I want my trait Outer to have two abstract member types Inner1 and Inner2. I want Inner2 to have abstract member type Inner1 also. I want to put a requirement that Outer#Inner1 is equal to Inner2#Inner1. What is the most conviniet way to do this? So far I have

trait HaveInner1 {
  type Inner1
}

trait Outer {
  type Inner1
  type Inner2 <: HaveInner1

  //    require Inner1 == Inner2#Inner1;
  def ?[T](implicit v: T): T = v
  implicit var ev: Inner2#Inner1 =:= Inner1 = ?[Inner2#Inner1 =:= Inner1]
}

The last two statements is not that pretty. Are there more idiomatic way to the same things?

Was it helpful?

Solution

trait HaveInner1 {
  type Inner1
}

trait Outer /*extends HaveInner1*/ { outer =>
  type Inner1
  type Inner2 <: HaveInner1 { type Inner1 = outer.Inner1 }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top