Scala - 协变式层次结构的根

时间:2011-06-17 06:07:47

标签: generics scala root class-hierarchy covariant

以下Scala类:

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

有效地定义了一个以Foo [Bar]为根的类型层次结构 - 即任何有效的Foo [X]都可以赋值给Foo [Bar]值或变量:

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

FooBase更进一步,也可能暗示不是Foo的对象 - 以下显示了问题:

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

...而且FooBase也不知道类型T,所以它的成员不能指定它,我必须在Foo中覆盖这些定义来专门化它们:

class FooBase {
  def ohNoIDontKnowTheType: Bar;
}

class Foo[+T <: Bar] extends FooBase {
  override def ohNoIDontKnowTheType: T = ...;
}

还有其他方法可以解决这个问题,但重点应该是明确的。

最后,我的实际问题是以下层次结构的根源:

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

再次,不要告诉我FooBase,因为事实并非如此。是的,我可以在专门用于此目的之间插入另一个类,但如上所述,这仍然不是一个真正的答案。

Scala不喜欢Foo(没有类型参数),也不是Foo[_],因为访问返回类型参数类型值的方法实际上是Any ,而不是Foo。当然,我们不能Foo[Foo],因为它也缺少第二个的类型参数,而Foo[Foo[_]]Foo[Foo[Foo[Foo[_]]]只会让我们达到这么多级别。

是否有答案或Scala是否缺乏对此的支持?

提前致谢!

1 个答案:

答案 0 :(得分:5)

Foo[_ <: Foo[_]]怎么样?顺便说一句,我在回答你的另一个问题时提到过。或者你可以这样写:

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