Scala:将路径相关类型分配给类型投影

时间:2012-06-10 18:43:04

标签: scala inner-classes path-dependent-type

他跟随编译:

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更改为List)

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的内部类。

更新:Travis Brown的回答似乎为第一个错误提供了正确的解释。我已经将MutableList的所有用法改为List。令人惊讶的是,这不仅停止了第一个错误,而且停止了第二个错尝试使用最外层GeomBase类之外的类型时,我也遇到了错误。我遇到了编译器崩溃。在实例化类型时。从MutableLists更改为Lists再次意外地删除了其中一个错误,但没有删除编译器崩溃。我一直在使用Scala Eclipse插件2.1特别版2.10.0-M3。这使我得出结论,Scala编译器和路径依赖类型仍然存在问题。

1 个答案:

答案 0 :(得分: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)

MutableList不是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]

例如,如果我们将其称为Seq[Int],我们会没事的,因为SeqMutableList的超类型。 List不是(尽管名称)。

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


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

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

不要这样做。 breakOutweird magic