Как использовать Array в JCommander в Scala - PullRequest
0 голосов
/ 26 апреля 2020

Я хочу использовать JCommander для разбора аргументов.

Я написал код:

import com.beust.jcommander.{JCommander, Parameter}
import scala.collection.mutable.ArrayBuffer

object Config {
  @Parameter(names = Array("--categories"), required = true)
  var categories = new ArrayBuffer[String]
}

object Main {
  def main(args: Array[String]): Unit = {
    val cfg = Config
    JCommander
      .newBuilder()
      .addObject(cfg)
      .build()
      .parse(args.toArray: _*)
    println(cfg.categories)
  }
}

Как это не получается с

com.beust.jcommander.ParameterException: Could not invoke null
    Reason: Can not set static scala.collection.mutable.ArrayBuffer field InterestRulesConfig$.categories to java.lang.String

Что я делаю неправильно

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Рабочий пример

import java.util

import com.beust.jcommander.{JCommander, Parameter}

import scala.jdk.CollectionConverters._


object Config {
  @Parameter(names = Array("--categories"), required = true)
  var categories: java.util.List[Integer] = new util.ArrayList[Integer]()

}

object Hello {
  def main(args: Array[String]): Unit = {
    val cfg = Config
    JCommander
      .newBuilder()
      .addObject(cfg)
      .build()
      .parse(args.toArray: _*)
    println(cfg.categories)
    println(cfg.categories.getClass())
    val a = cfg.categories.asScala
    for (x <- a) {
      println(x.toInt)
      println(x.toInt.getClass())
    }
  }
}
0 голосов
/ 26 апреля 2020

JCommander использует знания о типах в Java для сопоставления значений с параметрами. Но Java не имеет типа scala.collection.mutable.ArrayBuffer. Он имеет тип java.util.List. Если вы хотите использовать JCommander, вам нужно придерживаться встроенных типов Java.

Если вы хотите использовать типы Scala, используйте одну из библиотек Scala, которые обрабатывают более идиоматически c образом: scopt или снижение .

...