복붙노트

[SCALA] 스칼라 2.10에 반사를 통해 유형 매개 변수를 찾기?

SCALA

스칼라 2.10에 반사를 통해 유형 매개 변수를 찾기?

입력 한 태그를 사용하여, 나는 어떤 유형의 매개 변수를 볼 수 있어요 :

scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._

scala> typeOf[List[Int]]
res0: reflect.runtime.universe.Type = List[Int]

하지만 난 그냥 아주 프로그래밍이 중 "지능"즉, 일반적인 방법으로 얻을 방법을 알아낼 수 없습니다.

(내가 유형에 순열을 시도, 이제 시간 동안 REPL에서 주위를 배회 봤는데, 내가 그것에서 얻을 수있는보고 ... 내가 발견에 이것은 "목록"입니다 나타내는 많은 것,하지만 행운을 얻을 "지능이!"그리고 정말 있으며, toString () 출력을 구문 분석에 의존 싶지 않아 ...)

다니엘 소브랄 그는 당신이 알 일 경우에만 내가 무엇을 찾고에 어느때 가까이 가져하지만, (분명히)하는 여기에 빠른 (평소처럼) 훌륭한 개요를 가지고, 특정 클래스, 유형이 일부 특정 방법이 될 수 있습니다 심문 :

scala> res0.member(newTermName("head"))
res1: reflect.runtime.universe.Symbol = method head

scala> res1.typeSignatureIn(res0)
res2: reflect.runtime.universe.Type = => Int

그러나 나는 선언 방법 목록을 뒤져 그 중 하나가 어딘가에 태그의 현재 유형의 정보를 수집 (및 공개) 할 것으로 기대 포함하지 않는 일반적인 뭔가를 기대하고있다.

스칼라 그렇게 쉽게 인쇄 할 수있는 경우 "목록을 [지능]는"이 발견 열심히 왜 지구에 있는지 그 "지능"부분 - 문자열 패턴 매칭에 의존하지 않고? 아니면 내가 정말 분명, 정말 뭔가를 놓친 거지?

scala> res0.typeSymbol.asInstanceOf[ClassSymbol].typeParams
res12: List[reflect.runtime.universe.Symbol] = List(type A)

scala> res12.head.typeSignatureIn(res0)
res13: reflect.runtime.universe.Type = 

GRR ...

해결법

  1. ==============================

    1.슬프게도, 나는 당신에게 매개 변수를 제공하는 방법이 있다고 생각하지 않는다, 그러나 당신은 그들 중 보류이 방법을 얻을 수 있습니다 :

    슬프게도, 나는 당신에게 매개 변수를 제공하는 방법이 있다고 생각하지 않는다, 그러나 당신은 그들 중 보류이 방법을 얻을 수 있습니다 :

    Welcome to Scala version 2.10.0-20121007-145615-65a321c63e (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_35).
    Type in expressions to have them evaluated.
    Type :help for more information.
    
    scala> import scala.reflect.runtime.universe._
    import scala.reflect.runtime.universe._
    
    scala> typeOf[List[Int]]
    res0: reflect.runtime.universe.Type = scala.List[Int]
    
    scala> res0 match { case TypeRef(_, _, args) => args }
    res1: List[reflect.runtime.universe.Type] = List(Int)
    
    scala> res1.head
    res2: reflect.runtime.universe.Type = Int
    

    편집하다 여기에 (스칼라 - 내부의 논의를 다음) 같은 일을 달성하기 위해 약간 더 좋은 방법이있다 :

    scala> res0.asInstanceOf[TypeRefApi].args
    res1: List[reflect.runtime.universe.Type] = List(Int)
    
  2. ==============================

    2.스칼라 2.11부터 간단히 사용할 수 있습니다 :

    스칼라 2.11부터 간단히 사용할 수 있습니다 :

    yourGenericType.typeArgs.head
    

    매크로 변경 로그 포인트 번호 (14)를 참조하십시오.

  3. from https://stackoverflow.com/questions/12842729/finding-type-parameters-via-reflection-in-scala-2-10 by cc-by-sa and MIT license