복붙노트

[SCALA] 스칼라 - 케이스 클래스를 사용하여 없음 TypeTag 가능한 예외 TypeTag을 얻기 위해 시도?

SCALA

스칼라 - 케이스 클래스를 사용하여 없음 TypeTag 가능한 예외 TypeTag을 얻기 위해 시도?

나는 API를 반영 스칼라보고 그리고 난 예외를 많이 받고 있어요.

문서 참조 : http://docs.scala-lang.org/overviews/reflection/environment-universes-mirrors.html

어떻게 일반에서 typetag을받을 수 있나요?

  def getChildSettings[T: ru.TypeTag](path: String, settingsParameterObject: T) = {

    import scala.reflect.runtime.{ currentMirror => m }

    val m = ru.runtimeMirror(getClass.getClassLoader)
    val classC = ru.typeOf[T].typeSymbol.asClass
}

나는 예외를 얻을 :

No TypeTag available for ParameterObject.type

심지어 아주 간단한 예제 (는 REPL에서하는 편집 예)를 작동하지 않는 것

import scala.reflect.runtime.universe._
import scala.reflect.runtime.currentMirror
import scala.reflect.runtime.{universe => ru}

def getTypeTag[T: ru.TypeTag](obj: T) = ru.typeTag[T]

case class ParameterObject(stringType: String, optionType: Option[String])

getTypeTag(ParameterObject)

나는이 메소드를 호출하고있어 방법에 대한 그것의 일을 추측하고있어.

해결법

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

    1.나는 마지막으로 문제가 무엇인지 알게되었습니다. 케이스 클래스는 최상위 레벨을 정의해야합니다 -가 중첩 될 수 없습니다. 이런 식으로 뭔가가 실패합니다.

    나는 마지막으로 문제가 무엇인지 알게되었습니다. 케이스 클래스는 최상위 레벨을 정의해야합니다 -가 중첩 될 수 없습니다. 이런 식으로 뭔가가 실패합니다.

    class Foo {
      describe("getSettings") {
        case class ParameterObject(foo: String)
        settings.getTypeTag(path, ParameterObject)
      }
    }
    
    class Clazzy {
          def getTypeTag[T: TypeTag](obj: T) = ru.typeTag[T]
    }
    
  2. ==============================

    2.중첩 된 클래스의 태그를 입력해야하는 경우 WeakTypeTag를 사용할 수 있습니다. 왜 그런지 모르겠지만, 그것은 의도적으로입니다.

    중첩 된 클래스의 태그를 입력해야하는 경우 WeakTypeTag를 사용할 수 있습니다. 왜 그런지 모르겠지만, 그것은 의도적으로입니다.

  3. ==============================

    3.당신은 메인 클래스를 실행하기 전에 케이스 클래스를 선언하십시오

    당신은 메인 클래스를 실행하기 전에 케이스 클래스를 선언하십시오

    case class Person(name: String, age: Long)
    
    def main(args: Array[String]) {
       ...
        val people = sc.textFile("C:\\winutils\\people.txt").map(_.split(",")).map(p => Person(p(0), p(1).trim.toInt)).toDF()
    
  4. ==============================

    4.당신의 pom.xml에이 코드를 추가합니다

    당신의 pom.xml에이 코드를 추가합니다

    <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-reflect</artifactId>
        <version>2.12.0-M4</version>
    </dependency>
    
  5. ==============================

    5.그 삭제를 해결하려면 방법이기 때문에 당신은 컴파일시에 TypeTag이 필요합니다 :

    그 삭제를 해결하려면 방법이기 때문에 당신은 컴파일시에 TypeTag이 필요합니다 :

    import scala.reflect.runtime.{currentMirror => m, universe => ru}
    
    def getChildSettings[T: TypeTag](path: String, settingsParameterObject: T) = {
      val tpe    = ru.typeOf[T]
      // val classC = tpe.typeSymbol.asClass
      val ctor   = tpe.declaration(ru.nme.CONSTRUCTOR).asMethod
      ...
    }
    

    반사에 대한 스칼라 문서 개요 받고 생성자를 호출하는 예를 제공합니다.

  6. from https://stackoverflow.com/questions/16988558/scala-no-typetag-available-exception-when-using-case-class-to-try-to-get-typet by cc-by-sa and MIT license