2015-01-22 2 views
0

아파치 스파크를 사용하고 있습니다. 내 서브 루틴 중 하나는 RDD [T : ClassTag]의 T : ClassTag가 Map의 서브 클래스인지 확인하는 것입니다.왜 scala.reflect.runtime.universe.classTag [T] 함수가 누락 되었습니까?

나는 스칼라 반사에 많은 소스를 확인했는데 그들은 모두 다음 코드 제안 : 만 분명히 여기에 작동하지 않습니다 대해서 typeof 및 weakTypeOf를 참조

import scala.reflect.runtime.universe._ 
if classTag[T] <:< classTag[Map[_,_]] {do something...} 

classTag 기능이없는 것 같습니다 그러나이 (유형 삭제 때문에 : RDD의 ClassTag는 TypeTag보다 훨씬 적은 정보를 전달합니다). 그것은 나중에 다른 스칼라 버전에서 다른 곳으로 옮겨 졌습니까? 사용하고 있습니다 2.10.4

고마워요! 당신은 같은 방법으로에 TypeTag를 얻을 수 있습니다

import scala.reflect.runtime.universe._ 
scala> typeTag[Int].tpe <:< typeTag[Any].tpe 
res54: Boolean = true 

scala> typeTag[Int].tpe <:< typeTag[Boolean].tpe 
res55: Boolean = false 

:

답변

1

scala> import scala.reflect._ 
import scala.reflect._ 

scala> classTag[Option[Int]] 
res45: scala.reflect.ClassTag[Option[Int]] = scala.Option 

는 가장 현대는 documentation

하위 유형의 경우 확인 당신이 좋아, typeTag를 사용 갈까요 참조 scala.reflect 패키지입니다 ClassTag. 당신은 소거 유형 ClassTag에서 TypeTag을 가져올 경우

scala> def getTypeTag[T: TypeTag](ct: ClassTag[T]) = typeTag[T] 
getTypeTag: [T](ct: scala.reflect.ClassTag[T])(implicit evidence$1: reflect.runtime.universe.TypeTag[T])reflect.runtime.universe.TypeTag[T] 

scala> getTypeTag(classTag[Int]) 
res52: reflect.runtime.universe.TypeTag[Int] = TypeTag[Int] 

그냥 알려진 두 유형 사이의 하위 유형을 확인해야하는 경우 :

scala> typeOf[Int] <:< typeOf[Boolean] 
res56: Boolean = false 
+0

감사합니다 많이! 질문 하나 더 드릴까요? <: <는 2.10 이후에 @deprecated로 표시되었습니다. (대신 하위 유형 검사를 위해 scala.reflect.runtime.universe.TypeTag를 사용하십시오). ClassTag는 내가 가진 전부이기 때문에 분명히 작동하지 않을 것입니다.이 경고를 회피/억제하는 방법은 무엇입니까? – tribbloid

+0

알아두기 : classOf [map [_, _]]. isAssignableFrom (classTag [T] .runtimeClass) 함수 이름이 너무 이상합니다. 쓸데없는 생각없이 읽지 않아요. – tribbloid

+0

Java 방식으로, typeTags를 사용할 수 있습니다. 내 업데이트 – dk14

관련 문제