2017-03-19 211 views
0

我有以下类斯卡拉类型约束

case class A(vl: Int) 
case class B(name: String) 

现在我想创建一个类,像这样

case class Cllction[T](objs: Seq[T]) 

但事实是我想限制到只有两种AB。在Scala中可以这样做吗?我的意思是,例如,如果我尝试像这样创建:

val s = Seq[Int]() 
val c = Cllction(s) // should be compile error 

是否可以这样做?

回答

4

最直截了当的方法是使用一个共同的底座(标记性状),您然后用于结合的类型:

trait Col 
case class A(vl: Int) extends Col 
case class B(name: String) extends Col 

case class Cllction[T <: Col](objs: Seq[T]) 

如果不能修改AB,其他解决方案将是联合类型,但这需要更复杂的代码或使用库。请参阅How to define “type disjunction” (union types)?

+0

请注意,在这种情况下,您也可以使用'Cllction [Col]'而不是'Cllction [A]'或'Cllction [B]'。链接问题中的最佳答案不存在这个问题。 –