2017-03-19 17 views
0

私は、次のクラスScalaの型制約

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

は今、私はこの

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

のようなクラスを作成したい持っているが、事は、私はどちらか一方のみAまたはBことを制限したいです。 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 [A] 'や' Cllction [B] 'の代わりに' Cllction [Col] 'を使うこともできます。リンクされた質問の一番上の答えにこの問題はありません。 –

関連する問題