Есть ли способ позвонить члену в универсальном типе в Scala - PullRequest
0 голосов
/ 30 апреля 2019

Я пытаюсь вызвать член из универсального типа, и вот оригинальный способ запуска функции

SourceStruct - это объект, который я хочу заменить чем-то вроде T.

override def process(t: SourceStruct, runtimeContext: RuntimeContext, requestIndexer: RequestIndexer): Unit = {
        val json = new util.HashMap[String, String]()
        json.put("time", t.rating.toString)
        json.put("userId", t.userId.id.toString)
        json.put("itemId", t.itemId.id)

        requestIndexer.add(request)
      }

когда я заменю SourceStruct на T, как мне позвонить на t.userId?

override def process(t: T, runtimeContext: RuntimeContext, requestIndexer: RequestIndexer): Unit = {
      val json = new util.HashMap[String, String]()
//      json.put("userId", t.userId.id)
//      json.put("itemId", t.itemId.id)
//      json.put("rating", t.rating.toString)

      val request = Requests
        .indexRequest()
        .index(index)
        .`type`(indexType)
        .source(json)
      requestIndexer.add(request)
    }

заранее спасибо

Я могу получитьучастник, используя

typeOf[T].members.collect {
case m: MethodSymbol if m.isCaseAccessor => m
}.toList

, но по-прежнему не имеет ни малейшего понятия о вышеуказанном вопросе


РЕДАКТИРОВАТЬ:

, например:

case class ExampleClass(x: Int, y: Int)
case class ExampleClass2(xx: Int, yy: Int)

затем в функции процесса, как я могу присвоить значение члену

override def process(t: T, ...) = {
    //t.x = 10 or t.xx = 10 ???
}

решено

Преобразовать любой класс в HashMap

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Глядя на ваш код, кажется, что вы не хотите "вызывать член в универсальном типе", кажется, вы хотите преобразовать класс case в HashMap.

Класс Case вкарта в Scala

0 голосов
/ 30 апреля 2019

Вот небольшой фрагмент

  case class Foo(bar: String)

  val f: Object = Foo("a")

  val barField = f.getClass.getDeclaredField("bar")

  barField.setAccessible(true)
  val value = barField.get(f).asInstanceOf[String]

  print(value)

, чтобы присвоить значения, используйте

 barField.set(f, "new value")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...