Scala recursive generics: Parent[Child] and Child[Parent] -
update: clarified , expanded, since original question simplified far
i need pair of traits, each of refers other such parent , child classes must relate each other.
trait parent [c <: child] { def foo(c: c) } trait child [p <: parent] { def parent: p = ... def bar = parent.foo(this) }
such implementing classes must come in pairs:
class actualparent extends parent [actualchild] { def foo(c: actualchild) = ... } class actualchild extends child [actualparent] { }
unfortunately, compiler doesn't these traits because generic types aren't complete. instead of c <: child
needs c <: child[
something]
. leaving them unspecified doesn't work either:
trait parent [c <: child[_]] { def foo(c: c) } trait child [p <: parent[_]] { def parent: p = ... def bar = parent.foo(this) }
it complains on parent.foo(this)
line, because doesn't know this
of correct type. type of parent
needs parent[this.type]
call foo
have right types.
i'm thinking there must way of referring object's own type? or type that's required itself?
update: further @daniel's answer, tried using abstract type member within child state generic types of parent type this:
trait parent [c <: child] { def foo(c: c) } trait child { type p <: parent[this.type] def parent: p = ... def bar = parent.foo(this) }
this isn't working when try implement it:
class actualparent extends parent [actualchild] { def foo(c: actualchild) = ... } class actualchild extends child { type p = actualparent }
gives following error:
overriding type parent in trait child bounds >: nothing <: parent[actualchild.this.type] type parent has incompatible type
what mean?
you can use approach given in http://programming-scala.labs.oreilly.com/ch13.html:
abstract class parentchildpair { type c <: child type p <: parent trait child {self: c => def parent: p } trait parent {self: p => def child: c } } class actualparentchildpair1 { type c = child1 type p = parent1 class child1 extends child {...} class parent1 extends parent {...} }
Comments
Post a Comment