복붙노트

[SCALA] 어떻게 가변 인자와없는 방법 사이 스칼라에서 명확하게 않는다

SCALA

어떻게 가변 인자와없는 방법 사이 스칼라에서 명확하게 않는다

나는 스칼라에서 자바 jcommander 라이브러리를 사용하려고 해요. 자바 JCommander 클래스는 여러 개의 생성자가 있습니다 :

 public JCommander(Object object)  
 public JCommander(Object object, ResourceBundle bundle, String... args)   
 public JCommander(Object object, String... args)   

나는 어떤 변수 인수를 취하지 않는 최초의 생성자를 호출하고 싶습니다. 나는 시도했다 :

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)

어떻게 스칼라 내가 가변 인자를 고려하지 않습니다 생성자를 호출 할 말할까요?

나는 스칼라 2.8.0를 사용하고 있습니다.

해결법

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

    1.죄송합니다, 지금이 자바 알려진 상호 운용성 문제입니다 알고 있습니다. 이 질문 표를 참조하십시오. 내가 아는 주위에있는 유일한 작업은 이러한 호출을 명확하게하기 위해 작은 자바 클래스를 만드는 것입니다.

    죄송합니다, 지금이 자바 알려진 상호 운용성 문제입니다 알고 있습니다. 이 질문 표를 참조하십시오. 내가 아는 주위에있는 유일한 작업은 이러한 호출을 명확하게하기 위해 작은 자바 클래스를 만드는 것입니다.

  2. ==============================

    2.내가 알고있는이 문제에 대한 유일한 스칼라 솔루션은 반사를 포함한다.

    내가 알고있는이 문제에 대한 유일한 스칼라 솔루션은 반사를 포함한다.

    이제 우리는 자바 테스트 클래스가 있다고 가정하자 :

    public class Ambig {
      public Ambig() {}
      public String say(Object o) { return o.toString(); }
      public String say(Object o, String... ss) { return o.toString()+ss.length; }
    }
    

    우리는 직접 반사를 통해 메소드에 액세스 할 수 있습니다 :

    val ambig = new Ambig
    val methods = ambig.getClass.getMethods.filter(_.getName == "say")
    val wanted = methods.find(_.getParameterTypes.length == 1).get
    wanted.invoke(ambig, Some(5)).asInstanceOf[String]
    

    또는 우리는 더 적은 보일러와 같은 일을 달성하기 위해 (후드 반사를 사용하는) 구조 형식을 사용할 수 있습니다 :

    def sayer(speaker: { def say(o: Object): String }, o: Object) = speaker.say(o)
    sayer(new Ambig, Some(5))
    

    우리의 전략은 우리가 실제로 시작하는 객체가 없기 때문에 차이가 있습니다. 이제 우리는 자바 클래스가 있다고 가정하자

    public class Ambig2 {
      public final String say;
      public Ambig2(Object o) { say = o.toString(); }
      public Ambig2(Object o, String... ss) { say = o.toString()+ss.length; }
    }
    

    구조적 유형은 더 이상 작품을 접근,하지만 우리는 여전히 반사를 사용할 수 있습니다 :

    val mkAmbig2 = classOf[Ambig2].getConstructors.filter(_.getParameterTypes.length==1)
    val ambig = mkAmbig2.head.newInstance(Some(5)).asInstanceOf[Ambig2]
    ambig.say   // Some(5)
    
  3. ==============================

    3.나는 당신의 가장 쉬운 옵션은 문제를 해소하기 위해 공장 방법으로 자바 클래스를 가질 생각 :

    나는 당신의 가장 쉬운 옵션은 문제를 해소하기 위해 공장 방법으로 자바 클래스를 가질 생각 :

    package com.beust.jcommander;
    
    public class JCommanderFactory {
        public static createWithArgs(Object cmdLineArgs) {
            return new JCommander(cmdLineArgs);
        }
    }
    

    또한 대신 http://jewelcli.sourceforge.net/usage.html을 사용할 수 있습니다. JewelCli 동일한 목적 모호 공장 메소드를 가지며, 또한 PICA (주석 프록시 인터페이스 구성)에서 http://www.devx.com/Java/Article/42492/1954 기술을 사용한다.

    사실 나는 여기에 스택 오버플로 스칼라와 JewelCLI를 사용하는 예제가있다.

  4. ==============================

    4.이 모호성을 피할 수있는 방법은 싱글 컬렉션 통과 스칼라의 수집 폭발 구문을 사용하여 둘 이상의 인수를 취하는 오버로드를 선택하는 컴파일러를 강제하는 것입니다 :

    이 모호성을 피할 수있는 방법은 싱글 컬렉션 통과 스칼라의 수집 폭발 구문을 사용하여 둘 이상의 인수를 취하는 오버로드를 선택하는 컴파일러를 강제하는 것입니다 :

    import java.util.stream.Stream
    val stream = Stream.of(List(1):_*)
    
  5. ==============================

    5.당신은 가변 인자를 가진 생성자를 호출하지만, 가변 인자의 빈 목록을 전달할 수 있습니다.

    당신은 가변 인자를 가진 생성자를 호출하지만, 가변 인자의 빈 목록을 전달할 수 있습니다.

    (물론, 당신은 빈 변수 인수와 JCommander을 구성하는 인수없이 오버로드 된 생성자 (또는 메서드)를 호출과 같은 결과를 얻을 것이라는 점을 알고있는 경우)

    (: _ * 닐 cmdLineArgs) jCommander 새로운 JCommander를 =

  6. from https://stackoverflow.com/questions/3313929/how-do-i-disambiguate-in-scala-between-methods-with-vararg-and-without by cc-by-sa and MIT license