Как я снимаю неоднозначность в Scala между методами с vararg и без

Я пытаюсь использовать 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.

24
задан Brian Pugh 22 July 2010 в 22:45
поделиться

2 ответа

Извините, теперь я понял, что это известная проблема совместимости с Java. См. этот вопрос и тикет. Единственное известное мне решение - это создать небольшой класс Java, чтобы разграничить эти вызовы.

18
ответ дан 28 November 2019 в 23:47
поделиться

Я думаю, что ваш самый простой вариант - иметь класс 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.

5
ответ дан 28 November 2019 в 23:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: