在scala中,我有一个类的构造函数,它接受一个Products列表。我正在使用产品,因为我希望列表中的项目都具有一定的长度。有没有办法对产品进行类型限制?例如,我希望产品中的每个项目都是AnyVal。
我不认为这是可能的。有什么好的选择吗?我可以有一个Vector [AnyVal]列表,然后检查构造函数中每个向量的长度,但我希望通过类型强制执行长度。
答案 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
这似乎可以满足您的要求:“有没有办法对产品进行类型限制?”