以下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是否缺乏对此的支持?
提前致谢!
答案 0 :(得分:5)
Foo[_ <: Foo[_]]
怎么样?顺便说一句,我在回答你的另一个问题时提到过。或者你可以这样写:
type Base = Foo[t] forSome { type t <: Foo[t] }