免责声明: 这是可能的问题,而不是实际建议的内容。
假设您有以下课程:
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编译器为:::
选择正确的类型并生成指定结构类型的List?
答案 0 :(得分:2)
(points1 : List[{val x : Int; val y : Int}]) ::: points2 ::: points3
应该工作!
答案 1 :(得分: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