我实际上正在尝试创建一个可以在列中表示表格数据的类。这是我正在编写的代码的简化模型,旨在说明令我困惑的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?
答案 0 :(得分:1)
您需要在slope
中提出FunnyColumn
协变:
T
然后case class FunnyColumn[+T](data:List[T])
是FunnyColumn[Any]
的超类型。