Development Tip

이상한 배열 반환 유형

yourdevel 2020. 10. 29. 20:09
반응형

이상한 배열 반환 유형


[]이와 같은 메서드 서명 뒤에 배치 된 배열을 본 사람 이 있습니까?

public static String mySplit(String s)[] {
    return s.split(",");
}

public static void main(String... args) {
    String[] words = mySplit("a,b,c,d,e");
    System.out.println(Arrays.toString(words));
}

인쇄물

[a, b, c, d, e]

과거에는 "C"호환성에 대해 이상한 표기법이 사용되었지만 C로 작성하는 사람도 상상할 수 없습니다.

왜 이것이 허용되는지 아는 사람이 있습니까?

중요한 경우 Java 7 업데이트 10을 사용하고 있습니다.

이것은 Java 6에서 동일한 작업을 수행합니다. http://ideone.com/91rZV1


BTW 이것은 컴파일되지 않으며 예상하지도 않습니다.

public static <T> List mySplit(String s)<T> {
    return Collections.emptyList();
}

왜 이것이 허용되는지 아는 사람이 있습니까?

이 경우 Java 자체와의 하위 호환성을위한 것입니다. 로부터 JLS 섹션 8.4 :

이전 버전의 Java SE 플랫폼과의 호환성을 위해 배열을 반환하는 메서드 선언은 형식 매개 변수 목록 뒤에 배열 유형의 선언을 형성하는 빈 대괄호 쌍 (전체 또는 일부)을 배치 할 수 있습니다. 이것은 다음과 같은 노후화 된 프로덕션에서 지원되지만 새 코드에서는 사용해서는 안됩니다.

그리고 그렇습니다. 다른 개발자들에게 충격을주는 것 외에 다른 좋은 목적이없는 혐오스러운 것으로 간주해야합니다. 사실, 당신은 그것을 본 적이없는 사람들을 상대로 컴파일 될 것이라고 베팅함으로써 파티에서 돈을 얻기 위해 그것을 사용할 수있을 것입니다 ...

올바른 코더가 유효하지 않을 것으로 예상하는 방법은 다음과 같습니다.

public String[] mwahahaha(String[] evil[])[] {
    return evil;
}

마치

  String[] a; 

와 같다

  String a[];

메서드 반환 유형의 구문에 대해서도 동일하게 작동합니다.

  public static String mySplit(String s)[] {

와 같다

  public static String[] mySplit(String s) {

하지만 아직 생산적인 코드에서 언급 한 버전을 본 적이 없다고 생각합니다.


다음 변수 선언이 모두 동일하다는 것과 같은 이유라고 생각합니다.

String[] array
String array[]

이것은 C 개발자가하는 일이므로 그들을 돕기 위해 포함되었습니다.


반환 유형이 Strings선언과 동일한 배열임을 Java에 알리고 있다고 생각합니다.

static String[] mySplit(String s) {...

변수 선언과 유사합니다.

String myStringArray[];

다음과 같다

String[] myStringArray;

좋은 질문; Java 파서를 구현했을 때이 시점에서 JLS 문법에 정말 혼란 스러웠던 것을 기억합니다.

John의 답변을 확장하기 위해 다음과 같은 작업이 진행됩니다.

  • 이것은 사양에서 "혼합 표기법" 이라고 합니다.
  • 문법 두 조각, 이들 각각으로 구분 타입 선언은 0 이상 가질 수있다 [](S)를

이것이 중요한 장소는 (적어도) 5 곳입니다.

  • 메서드 유형 서명
  • 지역 변수 선언
  • 필드 선언
  • 형식 매개 변수
  • for-루프

Here's an excerpt from the grammar, focusing on method declarations:

MethodOrFieldDecl:
    Type Identifier MethodOrFieldRest

MethodOrFieldRest:  
    FieldDeclaratorsRest ;
    MethodDeclaratorRest

MethodDeclaratorRest:
    FormalParameters {[]} [throws QualifiedIdentifierList] (Block | ;)

Type:
    BasicType {[]}
    ReferenceType  {[]}

(Warning: it's difficult to read the grammar because the square and curly brackets are sometimes literals and sometimes metacharacters.)

This shows that [] can appear both under the Type rule, and as part of the MethodDeclaratorRest rule. It is optional in both places.


Yes, this is allowed,

same reason that:

String[] myArray;

is equivalent to

String myArray[];

참고URL : https://stackoverflow.com/questions/14203298/strange-array-return-type

반응형