Lea*_*ner 2 generics scala root class-hierarchy covariant
以下Scala类:
class Foo[+T <: Bar] extends FooBase ...
Run Code Online (Sandbox Code Playgroud)
有效地定义了一个以Foo [Bar]为根的类型层次结构 - 即任何有效的Foo [X]都可以赋值给Foo [Bar]值或变量:
val v1: Foo[Bar] = new Foo[SubBar1]();
val v2: Foo[Bar] = new Foo[SubBar2]();
Run Code Online (Sandbox Code Playgroud)
FooBase更进一步,也可能暗示不是Foo的对象 - 以下显示了问题:
class Trouble extends FooBase ...
val iOnlyWantFooHere: FooBase = new Trouble();
Run Code Online (Sandbox Code Playgroud)
...而且FooBase也不知道类型T,所以它的成员不能指定它,我必须在Foo中覆盖这些定义来专门化它们:
class FooBase {
def ohNoIDontKnowTheType: Bar;
}
class Foo[+T <: Bar] extends FooBase {
override def ohNoIDontKnowTheType: T = ...;
}
Run Code Online (Sandbox Code Playgroud)
还有其他方法可以解决这个问题,但重点应该是明确的.
最后,我的实际问题是以下层次结构的根源:
class Foo[+T <: Foo[T]] extends FooBase ...
Run Code Online (Sandbox Code Playgroud)
再说一遍,不要告诉我FooBase,因为事实并非如此.是的,我可以在专门用于此目的之间插入另一个类,但这仍然不是如上所述的真实答案.
Scala不喜欢just Foo(没有type参数),并且它不是Foo[_]因为然后访问返回类型参数类型的值的方法实际上Any不是Foo.当然,我们也做不到Foo[Foo],因为它也缺少第二个的类型参数,Foo[Foo[_]]或者Foo[Foo[Foo[Foo[_]]]只是让我们这么多级别.
是否有答案或Scala缺乏对此的支持?
提前致谢!
怎么样Foo[_ <: Foo[_]]?顺便说一句,我在回答你的另一个问题时提到过.或者你可以像这样写:
type Base = Foo[t] forSome { type t <: Foo[t] }
Run Code Online (Sandbox Code Playgroud)