以下的Scala类的根:斯卡拉 - 协变类型层次
class Foo[+T <: Bar] extends FooBase ...
有效地限定,其具有的Foo [巴]一种类型的层次结构作为其根 - 即,任何有效的Foo [X]将可分配给一个Foo [酒吧]值或变量:
val v1: Foo[Bar] = new Foo[SubBar1]();
val v2: Foo[Bar] = new Foo[SubBar2]();
FooBase进一步启动并也可能意味着不富的对象 - 下面说明了问题:
class Trouble extends FooBase ...
val iOnlyWantFooHere: FooBase = new Trouble();
...也FooBase不知道T类型的,因此其成员不能确定这一点,我不得不在富来覆盖这些定义专攻他们:
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缺乏对此的支持?
在此先感谢!
你可以省略分号;你也可以省略构造函数的空括号。 – ziggystar 2011-06-17 07:03:56