[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.죄송합니다, 지금이 자바 알려진 상호 운용성 문제입니다 알고 있습니다. 이 질문 표를 참조하십시오. 내가 아는 주위에있는 유일한 작업은 이러한 호출을 명확하게하기 위해 작은 자바 클래스를 만드는 것입니다.
죄송합니다, 지금이 자바 알려진 상호 운용성 문제입니다 알고 있습니다. 이 질문 표를 참조하십시오. 내가 아는 주위에있는 유일한 작업은 이러한 호출을 명확하게하기 위해 작은 자바 클래스를 만드는 것입니다.
-
==============================
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.나는 당신의 가장 쉬운 옵션은 문제를 해소하기 위해 공장 방법으로 자바 클래스를 가질 생각 :
나는 당신의 가장 쉬운 옵션은 문제를 해소하기 위해 공장 방법으로 자바 클래스를 가질 생각 :
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.이 모호성을 피할 수있는 방법은 싱글 컬렉션 통과 스칼라의 수집 폭발 구문을 사용하여 둘 이상의 인수를 취하는 오버로드를 선택하는 컴파일러를 강제하는 것입니다 :
이 모호성을 피할 수있는 방법은 싱글 컬렉션 통과 스칼라의 수집 폭발 구문을 사용하여 둘 이상의 인수를 취하는 오버로드를 선택하는 컴파일러를 강제하는 것입니다 :
import java.util.stream.Stream val stream = Stream.of(List(1):_*)
-
==============================
5.당신은 가변 인자를 가진 생성자를 호출하지만, 가변 인자의 빈 목록을 전달할 수 있습니다.
당신은 가변 인자를 가진 생성자를 호출하지만, 가변 인자의 빈 목록을 전달할 수 있습니다.
(물론, 당신은 빈 변수 인수와 JCommander을 구성하는 인수없이 오버로드 된 생성자 (또는 메서드)를 호출과 같은 결과를 얻을 것이라는 점을 알고있는 경우)
(: _ * 닐 cmdLineArgs) jCommander 새로운 JCommander를 =
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
'SCALA' 카테고리의 다른 글
[SCALA] 스칼라의 인수로 여러 줄 함수 리터럴 (0) | 2019.11.09 |
---|---|
[SCALA] 스칼라 : 암시 적 매개 변수 해상도 우선 순위 (0) | 2019.11.09 |
[SCALA] 소문자 변수 이름 스칼라 패턴 매칭 (0) | 2019.11.09 |
[SCALA] 스파크 DataFrame에 널 (null) 값을 교체 (0) | 2019.11.09 |
[SCALA] 어떤 구성 설정은 키 'akka.version'을 찾을 수 없습니다 (0) | 2019.11.09 |