복붙노트

[SCALA] 형식 매개 변수에 대한 스칼라 classOf

SCALA

형식 매개 변수에 대한 스칼라 classOf

나는 스칼라 / 자바를 사용하여 객체 업데이트에 대한 일반적인 방법을 만들기 위해 노력하고 있지만 형식 매개 변수에 대한 클래스를 얻을 수 없습니다.

여기 내 코드는 다음과 같습니다

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

내가 오류입니다

나는 당신이 그것을 할 수 없습니다 자바 알고 있지만 전혀 스칼라이 가능하다?

감사!

해결법

  1. ==============================

    1.때문에 매니페스트 (스칼라 2.10.0 이후)이 업데이트 된 대답은되지 않습니다 -

    때문에 매니페스트 (스칼라 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);
      ...
     }
    }
    
  2. ==============================

    2.바실의 맥심의 대답은 나를 도왔다.

    바실의 맥심의 대답은 나를 도왔다.

    개인적으로, 나는 그런 매개 변수를 (추가하는 데 사용되는 암시 적 구문을 선호하는 선물 : 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)
        ???
      }
    }
    

    면책 조항 : 나는 위의 컴파일하지 못했지만, 내 자신의 유사한 코드는이 방식으로 작동합니다.

  3. from https://stackoverflow.com/questions/6200253/scala-classof-for-type-parameter by cc-by-sa and MIT license