Aneh "[]" setelah tanda tangan metode Java


119

Saya melihat beberapa kode Java hari ini, dan saya menemukan beberapa sintaks yang aneh:

public class Sample {
  public int get()[] {
    return new int[]{1, 2, 3};
  }
}

Saya pikir itu tidak dapat mengkompilasi dan ingin memperbaiki apa yang saya pikir salah ketik, tetapi kemudian saya ingat kompiler Java benar-benar menerimanya!

Bisakah seseorang membantu saya memahami apa artinya? Apakah ini serangkaian fungsi?


10
woah, itu .. aneh ...; D
Nanne


2
Yang paling gila ... hal yang pernah saya lihat. Mereka bilang ruby ​​memiliki banyak keajaiban, makanlah ruby ​​itu!
IAdapter

16
Bahkan tidak terlihat sedikit aneh dibandingkan dengan tanda tangan dari suatu fungsi yang mengembalikan pointer ke berbagai pointer ke fungsi di C. :)
Kos

Jawaban:


111

Ini adalah metode yang mengembalikan file int[].

Spesifikasi Bahasa Java (8.4 Deklarasi Metode)

Untuk kompatibilitas dengan versi platform Java yang lebih lama, formulir deklarasi untuk metode yang mengembalikan array diizinkan untuk menempatkan (beberapa atau semua) pasangan braket kosong yang membentuk deklarasi tipe array setelah daftar parameter.

Ini didukung oleh produksi usang:

MethodDeclarator :
    MethodDeclarator []

tetapi tidak boleh digunakan dalam kode baru.


92
Bagian terbaik dari ini adalah sebagian atau seluruhnya . Jadi, jika Anda memiliki metode yang mengembalikan larik int 3 dimensi, Anda dapat melakukannya: public int[] foo()[][] {dan membuat mata orang berdarah.
Cowan

Saya harus mengatakan bahwa saya tertawa terbahak-bahak karena saya melihat kode itu! :-D
sdlins

20

Itu pertanyaan yang lucu. Di java Anda bisa mengatakan int[] a;, juga int a[];.
Dari perspektif ini, untuk mendapatkan hasil yang sama hanya perlu memindahkan []
dan menulis public int[] get() {.
Sepertinya kode tersebut berasal dari obfuscator ...


2
Dari obfuscator? Kemungkinan besar dari programmer C (Anda tidak dapat mengembalikan array, tetapi pointer ke tipe array - ya .. dan itu akan terlihat serupa).
Kos

4
@Kos: Mengapa Anda menyiratkan bahwa obfuscator dan programmer C haruslah dua hal yang berbeda? Seringkali tidak!
Lii

10

Karena ada tag C, saya akan menunjukkan bahwa notasi serupa (tapi tidak identik) dimungkinkan di C dan C ++:

Di sini fungsi fmengembalikan pointer ke array 10 int.

int tab[10];

int (*f())[10]
{
    return &tab;
}

Java tidak membutuhkan tanda bintang dan tanda kurung.


apakah ada sintaks yang lebih mudah untuk sebuah fungsi yang mengembalikan pointer ke array berdimensi n? (Bukan hanya int *)
ted

Sebenarnya saya harus menambahkan, pcc mendukung secara langsung f()[]artinya seperti (*f()).
AnArrayOfFunctions

4

sintaks java memungkinkan hal berikut:

int[] intArr = new int[0];

dan juga

int intArr[] = new int[0];

yang terlihat lebih fmiliar berasal dari sintaks gaya c.

begitu juga, dengan sebuah fungsi, namanya bisa muncul sebelum atau sesudah [], dan tipenya tetap int []


1
Ini benar-benar mengganggu saya karena seharusnya int [] karena faktanya itu adalah sebuah array adalah bagian dari tipe, bukan bagian dari namanya. Pascasarjana yang menulis kursus java uni saya melakukan hal yang sebaliknya sepanjang waktu dalam kodenya, itu mengerikan!
danpalmer

1
@danpalmer, saya setuju, meskipun menempatkan diri Anda pada posisi programmer ac yang sebenarnya memiliki darah untuk menulis nama int []. Lagi pula, ini bukan masalah besar, bahasa ini mendukung keduanya dan sebagian besar programmer java menggunakan konvensi int [], jadi selain satu atau dua pascasarjana yang mengganggu, ini jarang terjadi. siapa tahu, itu bahkan mungkin menguntungkan Anda jika mereka mengajukan pertanyaan seperti ini di final Anda
davin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.