他跟随编译:
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编译器和路径依赖类型仍然存在问题。
答案 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]
,我们会没事的,因为Seq
是MutableList
的超类型。 List
不是(尽管名称)。
在上一个示例中,您收到错误,因为grids(0).hexs
没有正确的类型 - 它不是MutableList[GridBase#HexG with T#HexTr]
。我不确定它是什么,因为你还没有和我们分享这些代码。
作为脚注:有趣的是(或者可能不是),以下内容确实有效:
xs.flatMap(_.toList)(collection.breakOut): List[Int]
不要这样做。 breakOut
为weird magic。