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(..)不定义所有类扩展的共同特征来创建可以包含所有三种点类型的结构类型列表,即

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 编译器选择正确的类型:::并生成指定结构类型的列表?

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 回答