2012-06-10 90 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的一個實例嗎? –