2012-06-25 7 views

답변

3

지우기 형식으로 인해 수 없습니다. 그러나, 나는 이것을하기위한 당신의 시도가 오해로부터 형성되었다고 주장 할 것입니다.

  • 형식 시스템의 요점은 컴파일러가 프로그램의 정확성에 대해 더 강력하게 추론 할 수 있도록하기 위해서입니다. 정적 타입 시스템에서
  • 는 각 참조가 프로그램에서

를 변경할 수없는 를 가지며,이 하나의 참조, a이며,이 기준의 유형 ClassWithTypeParameter[S]이다. 그. 그렇지. 모든. 컴파일러는이 참조로 수행 할 수있는 작업을 알 수 있습니다. 유형은 컴파일러를위한 것입니다. 런타임에, a에 할당 된 값은 ClassWithTypeParameter[A]과 관련이 없습니다. 일부 근사 (삭제에 의해 제한)이 일을


한 가지 가능한 방법은 (2.10 다른 뭔가라는) 명단 사용하는 것입니다

class ClassWithTypeParameter[+T: Manifest] { def erasure = manifest[T].erasure } 

는 그런 다음 erasure를 호출 할 수있는 너 java.lang.Class을 얻을 것이다. 내가 말했듯이, 이것은 제한되어 있습니다. 클래스유형과 같은 일을하지 않고 구별 할 수있는 방법은 ClassWithTypeParameter[List[Int]] 다음은 나쁜 생각하지만 (대부분의 반사의 사용 등) 작동

+0

을하지만 그것은 가능하다 CWTP [List [Int]]와 [CWTP [List [Double]]를 구분하기 위해 매니페스트를 사용하십시오. –

+0

@oxbow_lakes 설명해 주셔서 감사합니다. –

2

ClassWithTypeParameter[List[Double]], 예를 들어,이 없다 :

scala> val a: ClassWithTypeParameter[S] = new ClassWithTypeParameter[A] 
a: ClassWithTypeParameter[S] = [email protected] 

scala> a.paramIs[A] 
res0: Boolean = true 

scala> a.paramIs[S] 
res1: Boolean = false 

scala> a.paramIs[B] 
res2: Boolean = false 

그리고 :

을 우리에게 제공
class ClassWithTypeParameter[+T: Manifest] { 
    def paramIs[V: Manifest] = manifest[T] == manifest[V] 
} 

scala> val i = new ClassWithTypeParameter[List[Int]] 
i: ClassWithTypeParameter[List[Int]] = [email protected] 

scala> i.paramIs[List[Int]] 
res3: Boolean = true 

scala> i.paramIs[List[Double]] 
res4: Boolean = false 
는 다음을 사용하여 유사한 paramSubtypeOfparamSupertypeOf 방법을 쓸 수 Manifest<:<>:>.

스칼라 2.10에서

(마일스톤 4 이상)이 유형 얻을 a much more flexible way있어 :

class ClassWithTypeParameter[+T: TypeTag] { 
    def paramType = reflect.runtime.universe.typeTag[T].tpe 
} 

지금 당신이 바로 슈퍼 타입을 얻을 수 a.paramType.parents 같은 것들을 쓸 수 등

+0

추가 정보를 제공해 주셔서 감사합니다. –

관련 문제