以下 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 是否缺乏对此的支持?
提前致谢!