2

以下 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 不喜欢 just Foo(没有类型参数),也不Foo[_]是,因为返回类型参数类型的值的访问方法实际上是Any,而不是Foo。当然,我们也不能这样做Foo[Foo],因为这也缺少第二个的类型参数,Foo[Foo[_]]或者Foo[Foo[Foo[Foo[_]]]只能让我们获得这么多级别。

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

提前致谢!

4

1 回答 1

5

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

type Base = Foo[t] forSome { type t <: Foo[t] }
于 2011-06-17T06:48:24.757 回答