他下面编译:斯卡拉:分配路径依赖型,将投影
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编译器和路径相关类型仍然可能存在问题。
grids(0).hexs肯定是用T#hexTr类型的网格(0).HexG,它是投影类型的一个实例。没有相关的代码隐藏。网格实际上是空的,因为我只是试图在我正确实例化它之前获得匹配的类型。我没有看到使用网格(n)与使用整个集合有什么不同。 –
'grids(0)'将成为一个带有T#HexTr的GridBase#HexG,尽管不是任何东西的MutableList。 –
grids(0)肯定会成为GridBase的一个实例吗? –