유형 매개 변수에 대한 Scala classOf


80

scala / java를 사용하여 개체 업데이트를위한 일반 메서드를 만들려고하지만 유형 매개 변수에 대한 클래스를 가져올 수 없습니다.

내 코드는 다음과 같습니다.

object WorkUnitController extends Controller {     
 def updateObject[T](toUpdate: T, body: JsonObject){
  val source = gson.fromJson(body, classOf[T]);
  ...
 }
}

내가 얻는 오류는

클래스 유형이 필요하지만 T를 찾았습니다.

나는 자바에서는 할 수 없다는 것을 알고 있지만 이것이 스칼라에서 가능합니까?

감사!


답변:


93

Due Manifest더 이상 사용되지 않습니다 (Scala 2.10.0 이후) 이것은 업데이트 된 답변입니다-

import scala.reflect.ClassTag
import scala.reflect._

object WorkUnitController extends Controller {
  def updateObject[T: ClassTag](toUpdate: T, body: JsonObject){
    val source = gson.fromJson(body, classTag[T].runtimeClass)
    ???
  }
}

ClassTag대신 ClassManifest.runtimeClass대신 사용해야 합니다..erasure

원래 답변- 예, 매니페스트를 사용하여 수행 할 수 있습니다.

object WorkUnitController extends Controller {     
 def updateObject[T: ClassManifest](toUpdate: T, body: JsonObject){
  val source = gson.fromJson(body, classManifest[T].erasure);
  ...
 }
}

오 신 이시네요! 이 사실을 더 일찍 알았 으면 좋겠어요!
Darkzaelus

1
manifest[T]대신 쓸 수도 있습니다 implicitly[Manifest[T]].
Jean-Philippe Pellet

1
@ mericano1 그들은 매니페스트가 더 이상 실험적인 기능입니다, 생각, 언어의 필수적인 부분이 없으며, 한
바실 Remeniuk

12
@ mericano1 하나의 업데이트 : ManifestClassManifest이제는 사용되지 않으며 Scala 2.10에서 각각 TypeTag및 로 대체되었습니다 ClassTag.
다니엘 C. 소브랄

9
대신 classTag[T].runtimeClass내가 필요했습니다 classTag[T].runtimeClass.asInstanceOf[Class[T]]. 아무도 이유를 알고 있습니까?
kosii 2014

6

Vasil과 Maxim의 대답이 도움이되었습니다.

개인적으로 나는 implicit이러한 매개 변수를 추가하는 데 사용되는 구문을 선호합니다 (제시된 : ClassTag것은이를위한 축약 형입니다. 따라서 다른 사람이이 방법이 더 나은 방법이라고 생각하는 경우를 대비하여 여기에서).

import scala.reflect.ClassTag

object WorkUnitController extends Controller {
  def updateObject[T](toUpdate: T, body: JsonObject)(implicit tag: ClassTag[T]){
    val source = gson.fromJson(body, tag.runtimeClass)
    ???
  }
}

면책 조항 : 위의 내용을 컴파일하지 않았지만 비슷한 코드가 이런 방식으로 작동합니다.

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