2014-12-09 2 views
2
자바에서

없이 스칼라에서 슈퍼 클래스의 값 형식 인수를 반영, 슈퍼 클래스에 전달되는 실제의 형태 인수를 찾을 수 있습니다 스칼라 클래스와 같은 자바 반사, 그것은 스칼라의 값 형식을 잡을하지 않습니다이 TypeTag

class Base[T] 
class Derived extends Base[Int] 

classOf[Derived] 
    .getGenericSuperclass 
    .asInstanceOf[ParameterizedType] 
    .getActualTypeArguments // gives {Object.class}, not {int.class} 

은 일반적인 슈퍼 클래스에서 확장 할 때 사용되는 값 유형을 판별 할 수 있습니까? jar 파일에서 클래스를로드 할 때 java.lang.Class 인스턴스 만 사용하면 가장 좋을 것입니다.

답변

2

Int 및 기타 AnyVal 유형은 컴파일러에서 특별히 처리하므로 일반적으로 사용되는 경우 Object으로 표시되므로 유형을 가져올 수 없습니다. 그러나 스칼라 리플렉션을 사용할 수 있으며 자바 리플렉션에서 스칼라 리플렉션에 이르기까지 모든 작업이 가능합니다. 방법은 다음과 같습니다.

import scala.reflect.runtime.universe._ 

class Base[T] 

class Derived extends Base[Int] 

object Main extends App { 
    val rm = runtimeMirror(getClass.getClassLoader) // whatever class loader you're using 

    val derivedSym = rm.staticClass(classOf[Derived].getName) 
    val baseSym = rm.staticClass(classOf[Base[_]].getName) 
    val TypeRef(_, _, params) = derivedSym.typeSignature.baseType(baseSym) 
    println(s"$derivedSym extends $baseSym[${params.mkString(", ")}]") 
} 

불행히도 귀하가 무엇을 검색하고 있는지 정확히 알지 못하는 경우, 적절한 문서를 찾는 것이 어려울 것입니다. 대답은 scala-users mailing list입니다. 스칼라 반영은 아직 실험적이며 AFAIK, 향후 스칼라 버전에서 더 나은 것으로 대체 될 것입니다.