[scala] 유형 매개 변수에 대한 Scala classOf

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

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

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

내가 얻는 오류는

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

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

감사!



답변

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);
  ...
 }
}


답변

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)
    ???
  }
}

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


답변