1

免責事項: これは何が可能かという問題であり、実際に何が推奨されるかではありません。

次のクラスが与えられているとしましょう。

case class point1(x: Int, y:Int)
case class point2(x: Int, y:Int)
case class point3(x: Int, y:Int)

そして、各クラスのいくつかを含むリストがあります

val points1 = List[point1](/*Can be empty for this example*/)
val points2 = List[point2]()
val points3 = List[point3]()

++、 などの通常の手法を使用して:::、または.union(..)すべてのクラスが拡張する共通のトレイトを定義せずに、 3 つのポイント型すべてを含むことができる構造型のリストを作成することは可能ですか?

var points: List[{def x: Int; def y: Int}] = 
    points1 ::: points2 ::: points3

:::上記のように、演算子が を返すことを理解していますList[Product]。次のコードは正しい型のリストを生成するため、Scala コンパイラに正しいヒントを提供することが問題だと思います。

var points: ListBuffer[{def x: Int; def y: Int}] = List[{def x: Int; def y: Int}]()
points1.foreach( e => {
    val p: {def x: Int; def y: Int} = e;
    points.append(p);
})
points2.foreach( e => {
    val p: {def x: Int; def y: Int} = e;
    points.append(p);
})

:::Scala コンパイラが正しい型を選択し、指定された構造型の List を生成するのに役立つヒントはありますか?

4

2 に答える 2

2
(points1 : List[{val x : Int; val y : Int}]) ::: points2 ::: points3

うまくいくはずです!

于 2013-03-13T17:18:38.167 に答える
0

次のコードを書きたい場合:

var points: List[{def x: Int; def y: Int}] = 
points1 ::: points2 ::: points3

できます:

implicit def typer[B >: A, A <: { def x: Int; def y: Int }](t: List[B]): List[A] = t

var points: List[{def x: Int; def y: Int}] = 
points1 ::: points2 ::: points3
于 2013-03-13T17:24:51.740 に答える