2012-06-10 59 views
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更改为列表再次意外地删除了其中一个错误,但不是编译器崩溃。我一直在使用2.10.0-M3的Scala Eclipse插件2.1特别版。这导致我得出结论:Scala编译器和路径相关类型仍然可能存在问题。

回答

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],例如,我们会没事的,因为Seq是一个超类型MutableListList不是(尽管名称)。

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


作为一个注脚:有趣的是(或许不是),下面做工作:

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

不这样做,虽然。 breakOutweird magic

+0

grids(0).hexs肯定是用T#hexTr类型的网格(0).HexG,它是投影类型的一个实例。没有相关的代码隐藏。网格实际上是空的,因为我只是试图在我正确实例化它之前获得匹配的类型。我没有看到使用网格(n)与使用整个集合有什么不同。 –

+0

'grids(0)'将成为一个带有T#HexTr的GridBase#HexG,尽管不是任何东西的MutableList。 –

+0

grids(0)肯定会成为GridBase的一个实例吗? –