1

他以下编译:

import scala.collection.mutable.MutableList

abstract class GeomBase[T <: DTypes]
{  
  val grids = new MutableList[GridBase]

  def hexs: MutableList[GridBase#HexG with T#HexTr] = grids.flatMap(_.hexs.toList)
  //the above compiles fine

  abstract class GridBase
  { 
    val hexs: MutableList[HexG with T#HexTr] = new MutableList[HexG with T#HexTr]


    class HexG(coodI: Cood) extends Hex
    {
    }
  }
}

但是当我改变这条线时

def hexs: MutableList[GridBase#HexG with T#HexTr] = grids.flatMap (_.hexs.toList)

为此(将 MutableList 更改为列表)

def hexs: List[GridBase#HexG with T#HexTr] = grids.flatMap (_.hexs.toList)

它不再编译。这也不编译

def hexs: MutableList[GridBase#HexG with T#HexTr] = grids(0).hexs

它不会编译,说我在前一种情况下需要一个 MutableList 并在后一种情况下类型不兼容。我不明白为什么。只是为了澄清以防引起混淆 HexG 是 GridBase 的内部类,它本身就是 GeomBase 的内部类。

更新:特拉维斯布朗的回答似乎为第一个错误提供了正确的解释。我已将 MutableList 的所有用途更改为 List。令人惊讶的是,这不仅阻止了第一个错误,还阻止了第二个错误。尝试使用最外层 GeomBase 类之外的类型时,我也遇到了错误。我遇到了编译器崩溃。实例化类型时。再次从 MutableLists 更改为 Lists 会意外删除其中一个错误,但不会导致编译器崩溃。我一直在为 2.10.0-M3 使用 Scala Eclipse 插件 2.1 特别版。这使我得出结论,Scala 编译器和路径相关类型可能仍然存在问题。

4

1 回答 1

2

这里的问题(可能)与路径相关类型没有任何关系。考虑以下:

val xs: MutableList[Seq[Int]] = new MutableList ++ Seq(1 to 2, 3 to 4)

现在我们可以执行以下操作,例如:

scala> xs.flatMap(_.toList)
res0: scala.collection.mutable.MutableList[Int] = MutableList(1, 2, 3, 4)

但 aMutableList不是 a List

scala> xs.flatMap(_.toList): List[Int]
<console>:10: error: type mismatch;
 found   : scala.collection.mutable.MutableList[Int]
 required: List[Int]
              xs.flatMap(_.toList): List[Int]

例如,如果我们称它为 a Seq[Int],我们会很好,因为Seq它是 的超类型MutableListList不是(尽管有名字)。

在您的最后一个示例中,您收到一个错误,因为grids(0).hexs没有正确的类型 - 它不是MutableList[GridBase#HexG with T#HexTr]. 我不确定它是什么,因为您还没有与我们共享该代码。


作为脚注:有趣的是(或者可能不是),以下确实有效:

xs.flatMap(_.toList)(collection.breakOut): List[Int]

不过,不要这样做。breakOut奇怪的魔法

于 2012-06-10T19:44:48.077 回答