3

在 scala 中,我有一个用于获取产品列表的类的构造函数。我使用产品是因为我希望列表中的项目都有一定的长度。有没有办法对产品也有类型限制?例如,我希望产品中的每个项目都是 AnyVal。

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

4

2 回答 2

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也有效)。

于 2013-06-15T16:15:52.370 回答
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

这似乎给了你你所要求的:“有没有办法对产品也有类型限制?”

于 2013-06-17T13:59:12.290 回答