2017-03-19 209 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]'。鏈接問題中的最佳答案不存在這個問題。 –