【问题标题】:Scala - root of covariant type hierarchyScala - 协变类型层次结构的根
【发布时间】: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


【解决方案1】:

Foo[_ &lt;: Foo[_]] 怎么样?顺便说一句,我在回答你的另一个问题时确实提到了这一点。或者你可以这样写:

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

【讨论】:

  • 好吧,我错过了那个。我道歉。这是我希望的一个很好的答案。谢谢!
猜你喜欢
  • 2017-01-24
  • 2019-07-05
  • 2011-05-06
  • 2017-04-18
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
  • 2013-11-28
  • 1970-01-01
相关资源
最近更新 更多