_ (ขีดล่าง) เป็นคำหลักที่สงวนไว้


94

ฉันเพิ่งแทนที่sนิพจน์แลมบ์ดาต่อไปนี้โดย_:

s -> Integer.parseInt(s)

คอมไพเลอร์ Eclipse พูดว่า:

ไม่ควรใช้ '_' เป็นตัวระบุเนื่องจากเป็นคำหลักที่สงวนไว้ตั้งแต่ระดับแหล่งที่มา 1.8

ฉันไม่พบคำอธิบายใด ๆ ในโครงสร้างศัพท์ / คำหลักJLS §3.9

คำตอบ:


86

สถานที่ที่มองคือJLS §15.27.1 พารามิเตอร์ Lambda

เป็นข้อผิดพลาดเวลาคอมไพล์หากพารามิเตอร์แลมบ์ดามีชื่อ _ (นั่นคืออักขระขีดล่างเดียว)

ไม่สนับสนุนการใช้ชื่อตัวแปร _ ในบริบทใด ๆ เวอร์ชันในอนาคตของภาษาโปรแกรม Java อาจสงวนชื่อนี้เป็นคีย์เวิร์ดและ / หรือให้ความหมายพิเศษ

ดังนั้นข้อความ Eclipse จึงทำให้เข้าใจผิดโดยเฉพาะเมื่อมีการใช้ข้อความเดียวกันสำหรับทั้งสองกรณีเมื่อข้อผิดพลาดถูกสร้างขึ้นสำหรับพารามิเตอร์แลมบ์ดาหรือเมื่อมีการสร้างคำเตือนสำหรับ_ตัวระบุอื่น ๆ


24
โปรดทราบว่าใน Java 9 _จะไม่อนุญาตให้ใช้เป็นชื่อตัวระบุทางกฎหมายใด ๆ และไม่เพียง แต่เป็นชื่อพารามิเตอร์แลมบ์ดาเท่านั้น สิ่งนี้ได้รับการแก้ไขในบิลด์
Jean-François Savard

3
@lscoughlin:“ ภาษาการเขียนโปรแกรม Java เวอร์ชันอนาคตอาจสงวนชื่อนี้เป็นคีย์เวิร์ดและ / หรือให้คำสั่งความหมายพิเศษ” เพียงพอหรือไม่? ให้แทนที่ "อาจสงวน" ด้วย "จะใช้" และคุณจะได้ภาพ การอ้างอิงเมลนี้อาจช่วยได้…
Holger

6
นี่คืออะไร? Java ทำลายความเข้ากันได้แบบย้อนกลับ?
Arturo Torres Sánchez

8
@ Arturo Torres Sánchez: ไม่มีอะไรใหม่ มีหลายครั้งที่enumและassertเป็นตัวระบุทางกฎหมาย…
Holger

11
@ Holger มีภาษามากมายที่ใช้ขีดล่างเป็นตัวยึดชื่อ (Scala, Clojure, F #, SML, Erlang เพียงเพื่อตั้งชื่อไม่กี่ชื่อ) มันเป็นรูปแบบที่สร้างขึ้นซึ่งย้อนกลับไปในยุค 90 หรือ 80 ฉันเชื่อว่าการไม่เชื่อฟังมันเป็นเรื่องแปลก
om-nom-nom

25

เป็นเฟส 2 ของJEP 302ซึ่งจะเพิ่มขีดล่างเป็นอักขระพิเศษเพื่อแสดงถึงพารามิเตอร์ที่ไม่ได้ใช้ในนิพจน์แลมบ์ดา

การรักษาขีดล่าง

ในหลายภาษาเป็นเรื่องปกติที่จะใช้เครื่องหมายขีดล่าง ( _) เพื่อแสดงถึงพารามิเตอร์แลมบ์ดาที่ไม่มีชื่อ (และในทำนองเดียวกันสำหรับพารามิเตอร์วิธีการและพารามิเตอร์ข้อยกเว้น):

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

สิ่งนี้ช่วยให้สามารถตรวจสอบอาร์กิวเมนต์ที่ไม่ได้ใช้แบบคงที่ได้ดีขึ้นและยังอนุญาตให้ทำเครื่องหมายอาร์กิวเมนต์หลายรายการว่าไม่ได้ใช้ อย่างไรก็ตามเนื่องจากขีดล่างเป็นตัวระบุที่ถูกต้องใน Java 8 ความเข้ากันได้ทำให้เราต้องใช้เส้นทางทางอ้อมมากขึ้นในการไปยังจุดที่ขีดล่างสามารถให้บริการบทบาทนี้ใน Java ระยะที่ 1 ห้ามขีดล่างเป็นชื่อพารามิเตอร์ที่เป็นทางการแลมบ์ดาใน Java 8 (สิ่งนี้ไม่มีความเข้ากันได้เนื่องจากไม่มีแลมบ์ดามาก่อน) และมีการออกคำเตือนสำหรับการใช้ขีดล่างเป็นตัวระบุในที่อื่น ๆ เฟส 2 มาใน Java 9 เมื่อคำเตือนนี้กลายเป็นข้อผิดพลาด ขณะนี้เรามีอิสระที่จะดำเนินการฟื้นฟูสมรรถภาพตามแผนเพื่อระบุแลมบ์ดาวิธีการหรือพารามิเตอร์ที่เป็นทางการที่ไม่ได้ใช้


2
การใช้งานนี้จะกล่าวถึงโดยไบรอันเก๊ในการพูดคุยของเขา Devoxx 2017-11เกี่ยวกับโครงการสีเหลืองอำพัน
Basil Bourque

ตกลง แต่ทางเลือกอื่นในการแสดงพารามิเตอร์ที่ไม่ได้ใช้ใน J8 คืออะไร? เป็นไปไม่ได้เลยหรือ
Manuel

1
ปัจจุบันเราใช้$เพื่อการนี้
aventurin

1
ตอนนี้ฉันใช้ Java 14 และยังไม่สามารถใช้เครื่องหมายขีดล่างเป็นพารามิเตอร์แลมบ์ดาที่ไม่มีชื่อได้ ไม่ว่า JCP จะบรรลุเป้าหมายอะไรก็ตามดูเหมือนว่าพวกเขาประสบความสำเร็จในทางตรงกันข้าม
Frans

1
@Frans โปรดทราบว่า JEP (ณ วันนี้) อยู่ในขั้นตอนของผู้สมัครเท่านั้น ยังไม่เสร็จสมบูรณ์ สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับกระบวนการ JEP โปรดดูJEP 1
Alexandre de Champeaux

5

การเปลี่ยนแปลงภาษา Java สำหรับ Java SE 9 https://docs.oracle.com/javase/9/language/toc.htm#JSLAN-GUID-16A5183A-DC0D-4A96-B9D8-AAC9671222DD

จาก Java 9 อักขระ _ ไม่สามารถใช้เป็นตัวระบุได้อีกต่อไปไม่ใช่เฉพาะในบริบทแลมบ์ดา

อักขระขีดล่างไม่ใช่ชื่อตามกฎหมาย

หากคุณใช้อักขระขีดล่าง ("_") ตัวระบุจะไม่สามารถคอมไพล์ซอร์สโค้ดของคุณได้อีกต่อไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.