2017-09-24 1 views
2

스칼라는 컬렉션의 포함 된 클래스를 가져 오는 방법이 있습니까? 즉 내가 가지고있는 경우 :스칼라 - 벡터의 포함 된 클래스를 얻는 방법?

val foo = Vector[Int]() 

거기에서 classOf [Int]를 되 찾을 수있는 방법이 있습니까?

(그냥이 비어있을 수 있기 때문에 첫 번째 요소가 작동하지 않습니다 확인.) 당신이 방법에서 그것을 매개 변수를받을 경우

+0

[당신은 실제로 무엇을하려고합니까?] (http://mywiki.wooledge.org/XyProblem) 일단이 클래스 객체를 가지고 나면이 클래스 객체로 무엇을 할 것으로 예상합니까? –

답변

4

당신은 TypeTag를 사용할 수 있습니다

import scala.reflect.runtime.universe._ 

def getType[F[_], A: TypeTag](as: F[A]) = typeOf[A] 

val foo = Vector[Int]() 
getType(foo) 
2

컬렉션 자체에서,하지만, 당신이 그에게 암시 TypeTag을 추가 할 수 없음 메서드를 사용하여 런타임에 형식을 가져옵니다. 예 :

def mymethod[T](x: Vector[T])(implicit tag: TypeTag[T]) = ... 

자세한 내용은 https://docs.scala-lang.org/.../typetags-manifests.html을 참조하십시오.

1

기술적으로는 TypeTag 또는 Shapless 라이브러리에서 Typeable이/TypeCase을 (link 참조)를 사용하여 그것을 할 수 있습니다. 그러나 저는이 모든 트릭이 타입 매개 변수를 파고 들지 않고 작업을 완료하는 더 좋은 방법이 없을 때 실제로는 매우 진보 된 솔루션이라는 것을 알고 싶습니다.

scala 및 java의 모든 유형 매개 변수는 런타임시 유형 삭제의 영향을받으며 클래스에서 이러한 정보를 추출하려고 생각하면 구현하려는 솔루션을 다시 디자인하는 좋은 징표가 될 수 있습니다.

관련 문제