他下面編譯:斯卡拉:分配路徑依賴型,將投影
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的一個實例嗎? –