如何定义一个可以接受List [List [String]]和List [List [Int]]作为输入的案例类?

时间:2015-10-05 21:53:17

标签: scala

我实际上正在尝试创建一个可以在列中表示表格数据的类。这是我正在编写的代码的简化模型,旨在说明令我困惑的scala类型。

假设我有两种类型

case class FunnyColumn[T](data:List[T])
case class FunnyTable(items:List[FunnyColumn[Any]])

我想开始向我的FunnyTable添加内容,所以这里有。我制作了一堆我可能想要添加的列:

val intItem:FunnyColumn[Int] = new FunnyColumn(List(1,2,3))
val stringItem:FunnyColumn[String] = new FunnyColumn(List("A", "B", "C"))
val untypedItem:FunnyColumn[Any] = new FunnyColumn(List(1,2,3))

到目前为止一切顺利:

// works but seems icky, untyped FunnyColumns are not much use to me!
val funny0 = new FunnyTable(List(untypedItem))

我真的不希望我的列无类型 - 我希望我的所有列都有有意义的类型。在这个例子中,我尝试(并且失败)添加一个FunnyColumn [String]:

// Fails because it wants List[FunnyColumn[Any]] but I gave it List[FunnyColumn[Int]]
val funny1 = new FunnyTable(List(intItem))

问题似乎是因为我已经将FunnyTable定义为接受字面上的List[FunnyColumn[Any]],所以除Any类型的FunnyColumns列表之外的任何内容都必然会失败。

我想做的是让它可以将FunnyColumn的任何变体放入我的FunnyTable中,换句话说,这也应该有效:

// Fails because it wants List[FunnyColumn[Any]] but I gave it List[FunnyColumn[_ :> String with Int]]
val funny2 = new FunnyTable(List(intItem, stringItem))

如何重新定义我的FunnyTable类,以便在其中存储不同子类型的FunnyColumn?

1 个答案:

答案 0 :(得分:1)

您需要在slope中提出FunnyColumn协变:

T

然后case class FunnyColumn[+T](data:List[T]) FunnyColumn[Any]的超类型。