" 스칼라 타입 시스템 "에 따르면
val c = new C
val clazz = c.getClass // method from java.lang.Object
val clazz2 = classOf[C] // Scala method: classOf[C] ~ C.class
val methods = clazz.getMethods // method from java.lang.Class<T>
이 classOf[T]
메소드는 스칼라 유형의 런타임 표현을 리턴합니다. Java 표현식과 유사합니다 T.class
. 정보를 원하는 유형이있는 경우
사용하는 classOf[T]
것이 편리하지만 유형 getClass
의 인스턴스에서 동일한 정보를 검색하는 데 편리합니다.
그러나 classOf[T]
및 getClass
getClass의 경우에, JVM에 입력 소거의 영향을 반영하는 약간 다른 값을 반환한다.
scala> classOf[C]
res0: java.lang.Class[C] = class C
scala> c.getClass
res1: java.lang.Class[_] = class C
그렇기 때문에 다음이 작동하지 않습니다 .
val xClass: Class[X] = new X().getClass //it returns Class[_], nor Class[X]
val integerClass: Class[Integer] = new Integer(5).getClass //similar error
의 반환 유형에 관한 티켓getClass
이 있습니다 .
( James Moore 는 2 년 후 티켓이 "현재", 즉 2011 년 11 월에 수정되었다고보고합니다.
2.9.1에서는 getClass
이제 다음을 수행합니다.
scala> "foo".getClass
res0: java.lang.Class[_ <: java.lang.String] = class java.lang.String
)
2009 년으로 돌아 가기 :
스칼라가 getClass ()의 반환 값을 java.lang.Class [T]로 처리하는 경우 유용합니다. forSome {val T : C} 여기서 C는 getClass가있는 표현식의 정적 유형을 지우는 것과 같습니다. 호출
클래스에 대해 조사하고 싶지만 클래스 인스턴스가 필요하지 않은 경우 다음과 같은 작업을 수행 할 수 있습니다.
또한 조사하려는 클래스 유형을 제한하고 싶습니다. 따라서 Class [_ <: Foo]를 사용합니다. 그러나 이것은 캐스팅없이 Foo.getClass ()를 사용하여 Foo 클래스를 전달하지 못하게합니다.
참고 :에 getClass
대한 가능한 해결 방법은 다음과 같습니다.
class NiceObject[T <: AnyRef](x : T) {
def niceClass : Class[_ <: T] = x.getClass.asInstanceOf[Class[T]]
}
implicit def toNiceObject[T <: AnyRef](x : T) = new NiceObject(x)
scala> "Hello world".niceClass
res11: java.lang.Class[_ <: java.lang.String] = class java.lang.String