Pertanyaan _ (Underscore) adalah kata kunci cadangan


Saya baru saja diganti s dalam ekspresi lambda berikut oleh _:

s -> Integer.parseInt(s)

Eclipse compiler mengatakan:

'_' tidak boleh digunakan sebagai pengenal, karena ini adalah kata kunci cadangan dari tingkat sumber 1.8 pada.

Saya belum menemukan penjelasan di JLS §3.9 Struktur Lexis / Kata Kunci.


75
2018-05-07 17:02


asal


Jawaban:


Tempat yang harus dilihat adalah JLS §15.27.1. Parameter Lambda

Ini adalah kesalahan waktu kompilasi jika parameter lambda memiliki nama _ (yaitu, karakter garis bawah tunggal).

Penggunaan nama variabel _ dalam konteks apa pun tidak disarankan. Versi masa depan dari bahasa pemrograman Java dapat mencadangkan nama ini sebagai kata kunci dan / atau memberikan semantik khusus.   

Jadi pesan Eclipse menyesatkan, terutama karena pesan yang sama digunakan untuk kedua kasus, ketika kesalahan dihasilkan untuk parameter lambda atau ketika peringatan dibuat untuk yang lain _ identifier.


76
2018-05-07 18:25



Perubahan Bahasa Jawa untuk Java SE 9 https://docs.oracle.com/javase/9/language/toc.htm#JSLAN-GUID-16A5183A-DC0D-4A96-B9D8-AAC9671222DD 

Dari Java 9, karakter _ tidak dapat digunakan sebagai identifier lagi, tidak hanya dalam konteks lambda

Karakter garis bawah bukan nama yang sah.

Jika Anda menggunakan karakter underscore ("_") sebagai pengenal, kode sumber Anda tidak lagi dapat dikompilasi.


5
2017-09-27 11:48



Ini adalah Tahap 2 dari JEP 302, yang akan menambahkan garis bawah sebagai karakter khusus untuk menunjukkan parameter yang tidak digunakan dalam ekspresi lambda.

Pengobatan garis bawah

Dalam banyak bahasa, itu adalah umum untuk menggunakan underscore (_) untuk menunjukkan parameter lambda yang tidak disebutkan namanya (dan juga untuk parameter metode dan pengecualian):

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

Hal ini memungkinkan pengecekan statis lebih kuat dari argumen yang tidak digunakan, dan juga memungkinkan beberapa argumen untuk ditandai sebagai tidak terpakai. Namun, karena garis bawah adalah pengidentifikasi yang valid seperti Java 8, kompatibilitas mengharuskan kita untuk mengambil jalur yang lebih tidak langsung untuk mendapatkan di mana garis bawah dapat melayani peran ini di Jawa. Tahap 1 melarang garis bawah sebagai nama parameter resmi lambda di Java 8 (ini tidak memiliki konsekuensi kompatibilitas, karena lambdas tidak ada sebelumnya) dan peringatan dikeluarkan untuk menggunakan garis bawah sebagai pengidentifikasi di tempat lain. Fase 2 datang di Java 9, ketika peringatan ini menjadi kesalahan. Kami sekarang bebas untuk menyelesaikan rehabilitasi underscore yang direncanakan untuk menunjukkan lambda yang tidak digunakan, metode, atau menangkap parameter formal.


1
2017-07-09 22:34