2011-06-17 101 views
2

以下的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缺乏对此的支持?

在此先感谢!

+1

你可以省略分号;你也可以省略构造函数的空括号。 – ziggystar 2011-06-17 07:03:56

回答

5

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

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

那么,我错过了那里。我道歉。这是我期待的一个很好的答案。谢谢! – Learner 2011-06-17 12:50:21