将产品限制为scala中的值类型

时间:2013-06-15 15:26:54

标签: scala

在scala中,我有一个类的构造函数,它接受一个Products列表。我正在使用产品,因为我希望列表中的项目都具有一定的长度。有没有办法对产品进行类型限制?例如,我希望产品中的每个项目都是AnyVal。

我不认为这是可能的。有什么好的选择吗?我可以有一个Vector [AnyVal]列表,然后检查构造函数中每个向量的长度,但我希望通过类型强制执行长度。

2 个答案:

答案 0 :(得分:3)

您应该使用shapeless

例如,

trait T
class A extends T
class Q[X <: T, N <: shapeless.Nat](xs: shapeless.Sized[Seq[Int],N]) {}
new Q(shapeless.Sized(new A, new A))

将执行您想要的操作(并将类型限制为T的子类 - AnyVal也适用。)

答案 1 :(得分:1)

您可以使用scala类型系统将类型限制为AnyVals:

scala> val p:Product4[AnyVal,AnyVal,AnyVal,AnyVal] =(1,2,3,4)
p: Product4[AnyVal,AnyVal,AnyVal,AnyVal] = (1,2,3,4)

scala> val p:Product4[AnyVal,AnyVal,AnyVal,AnyVal] =(1,2,3,new Object)
<console>:13: error: type mismatch;
 found   : Object
 required: AnyVal

示例:

scala> class RestrictedClass (l:List[Product2[AnyVal,AnyVal]])
defined class RestrictedClass

scala> val i = List((1,2),(3,4),(new Object,5))
i: List[(Any, Int)] = List((1,2), (3,4), (java.lang.Object@15d1b97,5))

scala> new RestrictedClass(i)
<console>:16: error: type mismatch;
 found   : List[(Any, Int)]
 required: List[Product2[AnyVal,AnyVal]]
          new RestrictedClass(i)
                              ^
scala> val i2 = List((1,2),(3,4),(5,6))
i2: List[(Int, Int)] = List((1,2), (3,4), (5,6))

scala> new RestrictedClass(i2)
res5: RestrictedClass = RestrictedClass@88aa72

这似乎可以满足您的要求:“有没有办法对产品进行类型限制?”