Я пытаюсь использовать Java jcommander библиотека от Scala. Класс JCommander Java имеет несколько конструкторов:
public JCommander(Object object)
public JCommander(Object object, ResourceBundle bundle, String... args)
public JCommander(Object object, String... args)
Я хочу для вызова первого конструктора, который не берет varargs. Я попробовал:
jCommander = new JCommander(cmdLineArgs)
Я получаю ошибку:
error: ambiguous reference to overloaded definition,
both constructor JCommander in class JCommander of type (x$1: Any,x$2: <repeated...>[java.lang.String])com.beust.jcommander.JCommander
and constructor JCommander in class JCommander of type (x$1: Any)com.beust.jcommander.JCommander
match argument types (com.lasic.CommandLineArgs) and expected result type com.beust.jcommander.JCommander
jCommander = new JCommander(cmdLineArgs)
Я также попытался использовать именованный параметр, но получил тот же результат:
jCommander = new JCommander(`object` = cmdLineArgs)
Как я говорю Scala, что хочу вызвать конструктора, который не берет varargs?
Я использую Scala 2.8.0.
Извините, теперь я понял, что это известная проблема совместимости с Java. См. этот вопрос и тикет. Единственное известное мне решение - это создать небольшой класс Java, чтобы разграничить эти вызовы.
Я думаю, что ваш самый простой вариант - иметь класс Java с фабричным методом для решения этой проблемы:
package com.beust.jcommander;
public class JCommanderFactory {
public static createWithArgs(Object cmdLineArgs) {
return new JCommander(cmdLineArgs);
}
}
В качестве альтернативы вы можете использовать http://jewelcli.sourceforge.net/usage.html. JewelCli имеет однозначный фабричный метод для той же цели и также использует технику PICA (Proxied Interfaces Configured with Annotations) http://www.devx.com/Java/Article/42492/1954.
На самом деле у меня есть пример использования JewelCLI со Scala здесь, на Stack Overflow.