开发者

Scala - root of covariant type hierarchy

The following Scala class:

class Foo[+T <: Bar] extends FooBase ...

effectively defines a type hierarchy which has Foo[Bar] as its root - i.e. any valid Foo[X] will be assignable to a Foo[Bar] value or variable:

val v1: Foo[Bar] = new Foo[SubBar1]();
val v2: Foo[Bar] = new Foo[SubBar2]();

FooBase is further up and could also imply objects that are not Foo - the following shows the issue:

class Trouble extends FooBase ...
val iOnlyWantFooHere: FooBase = new Trouble();

... and also FooBase is not aware of type T, so its members cannot specify it and I'd have to override these definitions in Foo to specialize them:

class FooBase {
  def ohNoIDontKnowTheType: Bar;
}

class Foo[+T <: Bar] extends FooBase {
  override de开发者_如何学Gof ohNoIDontKnowTheType: T = ...;
}

There are other ways to work around that issue, but the point should be clear.

Finally, my actual question is what is the root of the following hierarchy:

class Foo[+T <: Foo[T]] extends FooBase ...

Again, do not tell me FooBase, because that is not the case. Yes, I could insert another class in between specifically for the purpose, but that is still not a true answer as indicated above.

Scala does not like just Foo (without the type parameter), and it is not Foo[_] either as then accessing methods returning the value of the type parameter type will actually be Any, not Foo. Of course, we cannot do Foo[Foo] either since that is also missing the type parameter for the second one and Foo[Foo[_]] or Foo[Foo[Foo[Foo[_]]] only gets us so many levels.

Is there an answer at all or does Scala lack support for this?

Thanks in advance!


How about Foo[_ <: Foo[_]]? Which, by the way, I did mention in my answer to your other question. Or you could write it like this:

type Base = Foo[t] forSome { type t <: Foo[t] }
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜