2014-07-01 1 views
0

(Object... arguments)을 수락 할 수있는 방법을 정의 할 수 있지만 ("A", "B")(["A", "B"])으로 전화하면 arguments의 값은 ["A", "B"]이됩니다. 즉 원래 서명이 손실됩니다.아무 것도 받아들이지 않고 서명을 보존하는 방법?

보존 방법이 있습니까?

P. 필요한 이유 :

호출중인 메소드와 인수를 기억하고 나중에 리플렉션을 통해 응답하십시오. 예 그것은 휴식 때 : 객체가 방법있다

나중에 전화 싶습니다

MyObj { 
    myMeth (String[] array) {...} 
} 
myObj = new MyObj() 

나는 몇 가지 인수 나중에 전화를 컴퓨터를 말한다.

callLater(myObj, "myMeth", ["A", "B"]) 

실제적인 방법을 찾고 호출하는 사용자 리플렉션을 기억합니다. 원래 서명이 없어져서 실패했습니다. (String[]) 대신 (String, String)을 찾습니다.

+0

:

callLater(myObj, "myMeth", (Object[]) new String[] {"A", "B"}); 

하거나 :

callLater(myObj, "myMeth", (Object) new String[] {"A", "B"}); 

는 두 개의 인수를 전달하려면 : 예를 들면, 하나 개의 인수로 배열을 전달하는 항상 배열로. 따라서 메소드 매개 변수로 Object []를 검색 할 수 있어야합니다. – MadProgrammer

+0

'원래 서명이 손실됩니다'는 아무런 의미가 없습니다. 그것은 잃어버린 것이 아닙니다. 이것은 단지 두 개의 다른 인수 목록을 통해 호출 할 수 있습니다. 이것은 전체적인 아이디어입니다. 귀하의 질문이 실제로 무엇인지는 분명하지 않습니다. – EJP

답변

1

이러한 종류의 모호성은 캐스트를 사용하여 발신자 측에서 해결됩니다. 이 경우 배열을 (Object)으로 먼저 캐스팅하여 varargs 인수로 처리되도록합니다. 내가 정확하게 반영, 변수 인수가 취급 기억 경우

callLater(myObj, "myMeth", "A", "B"); 
+0

고마워요.하지만이 방법은별로 편리하지 않습니다. 더 좋은 방법이 있습니까? DSL로 사용하고 간단하고 멋지게 유지하고 싶습니다. –

+0

뭔가 "멋지게"하려면 메서드의 두 가지 버전 (서로 다르게 명명되었으므로 과부하가 될 수 없음), 즉 varargs와 배열을 직접 가져 오는 버전을 제공해야합니다. –

+0

시도해 보았습니다. 컴파일러는 동일한 이름을 가진'(Object ... data)'와'(Object [] data)'두 개의 메소드를 금지합니다. –

관련 문제