2011-10-23 3 views
1

배열 매개 변수 선언으로 인해이 발생하는 구문 오류 이 발생합니다. 그럼에도 불구하고 main 메소드는 String 대신 String []을 사용합니다 ... 어떻게이 불일치를 이해할 수 있습니까?Java의 주된 메소드가 String 대신에 String []을 사용합니다. 도트 점이

package domain.test; 

import utilities.CConsole; 

public class Tester { 
    public static void main(String[] args) 
    { 
     Test1 t = new Test1(); 
     t.method1(0); // the array will exist but have a length of zero 
     t.method1(0, (Object[])null); // the array will not exist 
     t.method1(0, "a"); 
     t.method1(0, "a", "b"); 
     CConsole.pw.format("\n"); 

     t.method2(0); // the array will exist but have a length of zero 
     t.method2(0, (String[])null); // the array will not exist 
     t.method2(0, "a"); 
     t.method2(0, "a", "b"); 
     CConsole.pw.format("\n"); 
    } 
} 

class Test1 { 
    void method1(int number, Object... args) // Object[] causes syntax errors 
    { 
     if (args == null) 
      CConsole.pw.format("args == null\n"); 
     else 
     { 
      CConsole.pw.format("args != null "); 
      CConsole.pw.format("args.length %d\n", args.length); 
     } 
    } 

    void method2(int number, String... args) // String[] causes syntax errors 
    { 
     if (args == null) 
      CConsole.pw.format("args == null\n"); 
     else 
     { 
      CConsole.pw.format("args != null "); 
      CConsole.pw.format("args.length %d\n", args.length); 
     } 
    } 
} 

어떻게 불일치를 설명 할 수 있습니까?

컴파일하는 사람에게 다음이 포함됩니다.이 오류를 받으려면 method1()이 Object []를 사용하도록 변경하십시오.

요약 편집 : 강의가이 것으로 보입니다. 앤드류 이발사 (@ Andrew Barber)가 강조한 것처럼, String은 String과 구별됩니다. 보통 are not을 서로 바꿔서 사용할 수 있으므로 같은 방식으로 취급하지 마십시오 (교환 가능한 것으로 보이는 이유를 명명 할 수 있음에도 불구하고). 메인()의 경우 입니다. main()의 경우 일부 사람들은이 설탕을 전화 할 수도 있습니다.

+2

함수 인수에서'String []'을 사용하는 것이 유효합니다. 구문 오류가 발생하지 않습니다. 어떤 오류가 인쇄됩니까/ – birryree

+0

아니요, 코드를 복사하여 시도하십시오. – H2ONaCl

+1

구문 오류가 발생하는 이유는 무엇입니까? 'String []'을 매개 변수로 사용할 때 아무런 문제가 없습니다. – ryanprayogo

답변

2

일반적으로 varargs를 사용하여 메소드가 가변 개수의 인수를 입력으로 사용한다는 사실을 지정할 수 있습니다. 따라서 컬렉션, 배열 및 단순히 개별 객체를 Java에서 상호 교환하여 보낼 수 있습니다. 이것은 메소드를 단순화하지만 몇 가지 문제점이 있습니다. 선형 (즉 어레이 또는 컬렉션)이다

가변 인자 그들은 방법 서명 2)가 VAR의 인수로 정의되는 데이터 타입의 끝에있는 자연적)

한 경우 작동한다.

main (String [] args)은 var args를 사용하기에 자연스럽게 맞습니다 (즉, args는 메서드의 마지막에 있으며 마지막 매개 변수이므로 실제로 동일합니다) "String ... args"를 마지막 매개 변수로 선언 함). 그들을 더 잘 이해하기 위해 나는이 두 가지 방법을 쓰고 컴파일러가 무엇을하는지 지켜 볼 것을 제안합니다 :

당신의 질문에 대답 해주십시오 : 당신의 방법은 main 메소드에 다양한 수의 인자와 새로운 버전의 인자를 보내고 있습니다. 자바의 경우 var args를 main에 대한 입력으로 가져올 수 있습니다.

+0

"main (String [] args)은 var args를 사용하기에 자연 스럽습니다." 이것은 다소 모호합니다. 그러나 마지막 단락이 수용 이유입니다. – H2ONaCl

+1

@broiyan : 유감스럽게도 주 단원을 호출하는 메서드가 없으므로 마지막 단락은 정확하지 않은 것 같습니다. –

+0

필자는 Linux OS와 이클립스 IDE를 사용하므로 관련성이 있다고 보입니다. – H2ONaCl

5

Varargs는 이후 버전의 언어에서 추가되었습니다. main을 원할 경우 실제로는 varargs를 지원하는 Java 버전에서 을 String[] 이상 사용할 수 있습니다.

+0

main (String [] args)이 구문 오류가 아닌 이유는 무엇입니까? – H2ONaCl

+6

@broiyan 그 구문에는 아무런 문제가 없으므로. – EJP

+0

그러나 호출 시점의 다른 메소드에서는 구문이 허용되지 않습니다. – H2ONaCl

-4

문자열 []은 문자열 배열을 나타냅니다. 단일 문자열을 갖는 것만으로는 충분하지 않습니다. 더 많은 매개 변수로 프로그램을 실행하고 싶을 수 있기 때문입니다. 소위 "불일치"는 객체 지향 기술의 경우 정상입니다. 개별 클래스의 두 객체가 다르게 동작 할 수 있습니다. 초보자 만이 "모순"이라고 부릅니다. 객체 지향 패러다임에 대해 읽어보십시오. 그러면 직접 대답을 찾을 수 있습니다.

+2

'String ...'은 단일 문자열이 아닙니다. 모든 실제적인 목적을 위해 그것은'String []'과 똑같이 행동합니다. 'main()'에서 사용되지 않는 진정한 이유는 trinithis가 지적한 것처럼'main() '은 Java에서 vararg 지원을 오래 도입 한 것보다 오래 오래되었다는 것입니다. – aroth

+0

이 문제는 OOP와는 아무런 관련이 없습니다. – EJP

+0

@aroth 참으로'public static void main (String ... args)'을 선언 할 수 있습니다. – EJP

3

올바른 배열 매개 변수가 무엇인지 혼동하는 것 같습니다. varargs 매개 변수는 정의 된 모든 유형을 0 개 이상 전달할 수 있음을 의미합니다. 모호성이 없으면 배열을 전달할 수 있으며 배열의 내용은 varargs 인수로 확장됩니다.

배열 매개 변수는 정확히 하나의 배열을 전달해야 함을 의미합니다. varargs 인수를 Object[]String[]으로 바꿀 때 예제의 오류는 메서드를 호출하는 방법에서 비롯됩니다.예를 들면 :

t.method1(0, "a", "b"); 

이 가변 인자 호출 괜찮지 만, 바로 당신이 Object[]에 가변 인자 인수를 스위치로, 이전의 메서드 호출로 변경해야합니다 :

t.method(0, new Object[]{"a", "b"}); 

또는

배열이 다형성을 허용하기 때문에
t.method(0, new String[]{"a", "b"}); 

이 있습니다. 반대로, 여러분의 메소드가 varargs를 사용한다면, 배열을 전달하는 것은 잘 작동 할 것이다. 따라서 당신은 main 방법에 대한 불일치가 없다는 것을 알 수 있습니다. String[] 또는 String...은 작동 방식이 인 방식으로 표시되는 문제가 이 아닌으로 처리되기 때문에 작동합니다. 입니다. 업데이트

: 당신이 본격 비교를 찾는 것 같다 때문에이 5.2 Virtual Machine Start-Up에 JVM들은

Java 가상 머신이 그것을 통과, 의 방법의 주요 몇 가지 지정된 클래스를 호출하여 실행을 시작 말한다 단일 인수. 문자열 배열 입니다. 마지막 형식 매개 변수가 T [] 형식의 형식 매개 변수를 정의하는 것으로 간주됩니다 타입 T의 변수 인수에 대응 매개 변수, 인 경우

8.4.1 Formal Parameters

, 그것은

말한다. 그런 다음 방법 은 가변적 인 방법입니다. 그렇지 않은 경우 고정 방법입니다 메서드입니다. 변수 arity 메소드의 호출에는 형식 매개 변수보다 더 많은 인수 표현식이 포함될 수 있습니다. 앞에 형식 매개 변수와 일치하지 않는 모든 식의 변수 arity 매개 변수가 평가되고 결과가 메서드 호출에 전달 될 배열에 저장됩니다. 응용 프로그램 시작시 호출 할 때

는 따라서 주요 방법은 항상 String[]을 전달하고, 가변 인자 인수는 항상 배열로 각각의 방법으로 수신, 그래서 어디서나 어떤 불일치가 없습니다.

+1

@broiyan : 업데이트되었습니다. 원한다면 처음에 요청했을 수 있습니다. –

+0

항상 String []이고 main (String ... args)이 작동합니다. 나는 그것이 진짜 모순이라고 생각한다. (원래의 불일치는 답변 한 사람들의 노력 덕분에 해결되었습니다.) – H2ONaCl

+0

두 번째 인용문을주의 깊게 읽으십시오. 'String ...'은'String []'이 소스 코드에서 구문적인 설탕을 허용한다는 것을 제외하고는 모든 의도와 목적에 대해'String []'과 동일합니다. 불일치가 없습니다. –

0

간단하고 정확한 답변은 둘 중 하나를 사용할 수 있다는 것입니다.

+0

운영체제를 변경하지 않고'main()'에서 사용할 수 있습니다. "인공적인 도움"을 기대하지 않는 한 다른 방법으로도 사용할 수 있습니다. – H2ONaCl

+0

@broiyan 그것은 내가 말한 것뿐만 아니라, 내가 말한 것과 정확히 관련이없는 운영체제와 관련이없는 운영체제와 관련없는 무분별한 진술없이 실제로 말한 것입니다. '인공 조력'에 대한 진술은 완전히 잘못되었습니다. 당신이 사용하는 경우 ... 호출 사이트에서 varargs * 또는 * 배열을 사용할 수 있습니다. 이것이 내가 '인공적인 도움'이라고 부르는 것입니다. – EJP

관련 문제