【发布时间】:2011-06-17 06:07:46
【问题描述】:
以下 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 对此缺乏支持?
提前致谢!
【问题讨论】:
-
可以省略分号;你也可以省略构造函数的空括号。
标签: generics scala root class-hierarchy covariant