在 scala 中,我有一个用于获取产品列表的类的构造函数。我使用产品是因为我希望列表中的项目都有一定的长度。有没有办法对产品也有类型限制?例如,我希望产品中的每个项目都是 AnyVal。
我不认为这是可能的。有什么好的选择吗?我可以有一个 Vector[AnyVal] 的列表,然后检查构造函数中每个向量的长度,但我希望长度由类型强制执行。
在 scala 中,我有一个用于获取产品列表的类的构造函数。我使用产品是因为我希望列表中的项目都有一定的长度。有没有办法对产品也有类型限制?例如,我希望产品中的每个项目都是 AnyVal。
我不认为这是可能的。有什么好的选择吗?我可以有一个 Vector[AnyVal] 的列表,然后检查构造函数中每个向量的长度,但我希望长度由类型强制执行。
你应该使用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
也有效)。
您可以使用 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
这似乎给了你你所要求的:“有没有办法对产品也有类型限制?”