_ (밑줄)은 예약 된 키워드입니다.


94

s다음 람다 식에서 다음으로 대체 했습니다 _.

s -> Integer.parseInt(s)

Eclipse 컴파일러는 다음과 같이 말합니다.

'_'는 소스 레벨 1.8부터 예약 된 키워드이므로 식별자로 사용해서는 안됩니다.

JLS §3.9 어휘 구조 / 키워드 에서 설명을 찾지 못했습니다 .

답변:


86

살펴볼 곳은 JLS §15.27.1입니다. Lambda 매개 변수

람다 매개 변수의 이름이 _ (즉, 단일 밑줄 문자) 인 경우 컴파일 타임 오류입니다.

어떤 상황에서든 변수 이름 _을 사용하지 않는 것이 좋습니다. Java 프로그래밍 언어의 향후 버전에서는이 이름을 키워드로 예약하거나 특수한 의미를 부여 할 수 있습니다.

따라서 Eclipse 메시지는 오해의 소지가 있습니다. 특히 람다 매개 변수에 대해 오류가 생성되거나 다른 _식별자에 대해 경고가 생성 될 때 두 경우 모두에 동일한 메시지가 사용되기 때문 입니다.


24
Java 9 _부터는 람다 매개 변수 이름뿐만 아니라 유효한 식별자 이름으로도 허용되지 않습니다. 이것은 실제로 빌드 43에서 수정되었습니다. bugs.openjdk.java.net/browse/JDK-8061549
Jean-François Savard

3
@lscoughlin : "Java 프로그래밍 언어의 향후 버전에서는이 이름을 키워드로 예약하거나 특수한 의미를 부여 할 수 있습니다."라고 충분하지 않습니까? 글쎄, "예약 가능"을 "사용할 예정"으로 바꾸면 그림을 볼 수 있습니다. 어쩌면 이 메일 참조 하는 데 도움이 ...
홀거

5
이게 뭐야? Java가 이전 버전과의 호환성을 깨고 있습니까?
Arturo Torres Sánchez

8
@Arturo Torres Sánchez : 그것은 새로운 것이 아닙니다. 이 시간이있을 때 enumassert법적 식별자는 ... 있었다
홀거

11
@Holger는 실제로 밑줄을 이름 자리 표시 자로 사용하는 수많은 언어가 있습니다 (Scala, Clojure, F #, SML, Erlang 등). 그것은 90 년대 나 80 년대로 거슬러 올라가는 확립 된 패턴이라고 생각합니다. 그래서 불순종하는 것은 이상합니다.
om-nom-nom 2015

25

JEP 302의 2 단계 로 람다 식에서 사용되지 않는 매개 변수를 표시하기 위해 특수 문자로 밑줄을 추가 할 예정입니다.

밑줄 처리

많은 언어에서 밑줄 ( _)을 사용하여 이름이 지정되지 않은 람다 매개 변수를 나타내는 것이 일반적입니다 .

BiFunction<Integer, String, String> biss = (i, _) -> String.valueOf(i);

이렇게하면 사용되지 않는 인수에 대한보다 강력한 정적 검사가 가능하고 여러 인수가 사용되지 않음으로 표시 될 수 있습니다. 그러나 밑줄은 Java 8에서 유효한 식별자 였기 때문에 호환성으로 인해 Java에서 밑줄이이 역할을 수행 할 수있는 위치에 대한보다 간접적 인 경로를 취해야했습니다. 1 단계는 Java 8에서 람다 형식 매개 변수 이름으로 밑줄을 금지했으며 (이전에 람다가 존재하지 않았기 때문에 호환성 결과가 없음) 다른 위치에서 밑줄을 식별자로 사용하는 것에 대한 경고가 발행되었습니다. 이 경고가 오류가되었을 때 2 단계는 Java 9에서 왔습니다. 이제 사용되지 않은 람다, 메서드 또는 catch 형식 매개 변수를 나타 내기 위해 계획된 밑줄 재활을 자유롭게 완료 할 수 있습니다.


2
이 사용법은 Brian Goetz 가 Project Amber 에 대한 2017-11 년 Devoxx 강연 에서 논의되었습니다 .
Basil Bourque

좋습니다.하지만 J8에서 사용되지 않는 매개 변수를 나타내는 대안은 무엇입니까? 그것은 전혀 가능하지 않습니까?
Manuel

1
현재이 $목적으로 사용하고 있습니다 .
aventurin

1
저는 현재 Java 14를 사용 중이며 이름이 지정되지 않은 람다 매개 변수로 밑줄을 사용할 수 없습니다. JCP가 달성하기 위해 설정 한 것이 무엇이든, 그들은 그 반대를 달성 한 것으로 보입니다.
Frans

1
@Frans JEP는 (오늘 현재) 후보 단계에만 있습니다. 아직 완료되지 않았습니다. JEP 프로세스에 대한 자세한 내용은 JEP 1
Alexandre de Champeaux

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.