2013-06-15 1 views
3

스칼라에는 제품 목록을 사용하는 클래스의 생성자가 있습니다. 목록에있는 항목의 길이를 모두 지정하기 때문에 제품을 사용하고 있습니다. 제품에 유형 제한이있는 방법이 있습니까? 예를 들어 제품의 모든 항목을 AnyVal로 지정하려고합니다.제품을 스칼라로 값 유형을 제한하십시오.

나는 이것이 가능하지 않다고 생각합니다. 좋은 대안이 있습니까? Vector [AnyVal]의 목록을 가지고 생성자에서 각 벡터의 길이를 확인할 수는 있지만 형식에 따라 길이를 선호합니다.

+2

법안에 적합한 https://github.com/milessabin/shapeless가 있습니다. 암시 적 인수로 제한 조건을 인 코드 할 수도 있습니다. 당신이 이상적으로 달성하려고 시도하는 것의 일부 코드 스 니펫이 도움이 될 수 있습니다. – huynhjl

+0

@huynhjl 암묵적인 인수로 어떻게 이것을 수행 할 수 있습니까? – mushroom

+0

정확히 무엇을 하려는지 확실하지 않습니다. 간단한 설명에서 알 수 있듯이 다음과 같이 작동합니다 :'type P3 = Product3 [AnyVal, AnyVal, AnyVal]; 클래스 C (list : List [P3]); 새로운 C (List ((1,2,3), ("a", "b", "c")) : List [P3])'. – huynhjl

답변

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

당신은 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), ([email protected],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 = [email protected] 

: "을 어떤 방법이 있나요 제품에 대한 유형 제한도 있습니까? "

관련 문제