Java java.lang.Class <T> 객체와 동등한 스칼라


183

질문은 예를 통해 가장 잘 설명됩니다.

JPA EntityManager의 Java에서 다음을 수행 할 수 있습니다 (계정은 내 엔티티 클래스입니다).

Account result = manager.find(Account.class, primaryKey);

스칼라에서 나의 순진한 시도는 다음과 같습니다.

val result = manager.find(Account.class, primaryKey)

그러나 Account.class스칼라에서 사용하려고하면 좋아하지 않는 것 같습니다. Scala의 Account 클래스에 대해 java.lang.Class 객체를 지정하려면 어떻게해야합니까?


VonC는 이미 답변을 제공했지만 Scala & Erasure에 대한 본인의 질문 / 답변 을 살펴보십시오 . 나는 그것이 당신이 시도하는 것과 다른 방식으로 일을하는 아이디어를 제공 할 수 있다고 생각합니다.
Daniel C. Sobral

답변:


264

" 스칼라 타입 시스템 "에 따르면

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]getClassgetClass의 경우에, 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

4
참고로, @VonC에 언급 된 티켓은 11 월 6 일 22 일에 고정 된 것으로 표시되었습니다. 2.9.1에서 getClass는 다음을 수행합니다. scala> "foo".getClass res0 : java.lang.Class [_ <: java.lang.String] = class java.lang.String
James Moore

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.