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 の内部クラスです。

更新: Travis Brown の回答は、最初のエラーの正しい説明を提供しているようです。MutableList のすべての使用法を List に変更しました。驚いたことに、これにより最初のエラーだけでなく、2 番目のエラーも停止しました。最も外側の GeomBase クラスの外部で型を使用しようとしたときにもエラーが発生しました。コンパイラがクラッシュしました。型をインスタンス化するとき。MutableLists から Lists に再度変更すると、予期せずこれらのエラーの 1 つが削除されましたが、コンパイラはクラッシュしませんでした。私は 2.10.0-M3 用の Scala Eclipse プラグイン 2.1 スペシャル エディションを使用していました。これにより、Scala コンパイラーとパス依存型にまだ問題がある可能性があるという結論に至りました。

4

1 に答える 1

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)

しかし、 aMutableListは a ではありません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]

たとえば、これをa と呼んだ場合、は のスーパータイプであるSeq[Int]ため、問題ありません。そうではありません(名前にもかかわらず)。SeqMutableListList

最後の例でgrids(0).hexsは、 が正しい型を持っていないため、エラーが発生していMutableList[GridBase#HexG with T#HexTr]ます。あなたはそのコードを私たちと共有していないので、それが何であるかはわかりません.


脚注として: 興味深いことに (あるいはそうでないかもしれませんが)、以下は機能します。

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

ただし、これを行わないでください。変な魔法breakOutです。

于 2012-06-10T19:44:48.077 に答える