Java yöntemi imzasından sonra tuhaf "[]"


119

Bugün bazı Java kodlarına baktım ve garip bir sözdizimi buldum:

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

Bunun derlenemeyeceğini düşündüm ve yazım hatası olduğunu düşündüğüm şeyi düzeltmek istedim, ancak daha sonra Java derleyicisinin bunu gerçekten kabul ettiğini hatırladım!

Lütfen birisi bunun ne anlama geldiğini anlamama yardım edebilir mi? Bir dizi işlev mi?


10
woah, bu .. garip ...; D
Nanne


2
Şimdiye kadar gördüğüm en çılgın şey. Ruby'nin çok sihri olduğunu söylüyorlar, o yakutu ye!
IAdapter

16
C'deki işlevlere işaretçiler dizisine bir işaretçi döndüren bir işlevin imzasına kıyasla uzaktan tuhaf görünmüyor bile :)
Kos

Yanıtlar:


111

Bu, bir int[].

Java Dil Belirtimi (8.4 Yöntem Bildirimleri)

Java platformunun eski sürümleriyle uyumluluk için, bir dizi döndüren bir yöntem için bir bildirim formunun, parametre listesinden sonra dizi türünün bildirimini oluşturan boş parantez çiftlerini (bazılarını veya tümünü) yerleştirmesine izin verilir.

Bu, eskimiş üretim tarafından desteklenmektedir:

MethodDeclarator :
    MethodDeclarator []

ancak yeni kodda kullanılmamalıdır.


92
Bunun en iyi yanı, bir kısmı veya tamamı olmasıdır . Yani, 3 boyutlu bir dizi döndüren bir yönteminiz varsa, şunları yapabilirsiniz: public int[] foo()[][] {ve insanların gözlerini kanartabilirsiniz.
Cowan

Bu kodu gördüğümden beri yüksek sesle güldüğümü söylemeliyim ! :-D
sdlins

20

Bu komik bir soru. Java size söyleyebiliriz int[] a;yanı sıra int a[];.
Bu açıdan bakıldığında aynı sonucu alabilmek için sadece hareket ettirip []
yazmanız yeterlidir public int[] get() {.
Yine de kod bir gizleyiciden gelmiş gibi görünüyor ...


2
Bir obfuscator'dan mı? Büyük ihtimalle bir C programcısından (bir dizi döndüremezsiniz, ancak dizi türüne bir gösterici - evet .. ve benzer görünür).
Kos

4
@Kos: Neden bir obfuscator ve bir C programcısının iki farklı şey olması gerektiğini ima ediyorsunuz? Çoğu zaman değiller!
Lii

10

Bir C etiketi olduğu için, benzer (ancak aynı olmayan) bir gösterimin C ve C ++ 'da mümkün olduğunu belirteceğim:

Burada fonksiyon f10 inçlik bir diziye bir işaretçi döndürür.

int tab[10];

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

Java'nın yıldız ve paranteze ihtiyacı yoktur.


n boyutlu bir diziye bir gösterici döndüren bir işlev için daha kolay bir sözdizimi var mı? (Sadece bir int * değil)
TED

Aslında şunu eklemeliyim ki, pcc destekleri f()[]gibi bir şeyi doğrudan destekler (*f()).
AnArrayOfFunctions

4

java'nın sözdizimi aşağıdakilere izin verir:

int[] intArr = new int[0];

ve ayrıca

int intArr[] = new int[0];

c-stili sözdiziminden gelen daha tanıdık geliyor.

aynı şekilde, bir işlevle, ad [] karakterinden önce veya sonra gelebilir ve tür hala int []


1
Bu gerçekten int [] olması gerektiği için beni gerçekten rahatsız ediyor çünkü dizinin bir dizi olması, adının bir parçası değil türünün bir parçası. Üniversite java kurslarımı yazan lisansüstü, kodunda her zaman tam tersini yapıyor, bu korkunç!
danpalmer

1
@danpalmer, katılıyorum, her ne kadar kendini int ismini [] yazmak için kendi kanında bulunan ac programcısının yerine koysa da. her neyse, o kadar da önemli değil, dil her ikisini de destekliyor ve çoğu java programcısı int [] kuralını kullanıyor, bu yüzden sinir bozucu bir veya iki lisansüstü dışında nadiren. kim bilir, finalinizde böyle bir soru sorarlarsa bu sizin lehinize bile olabilir
davin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.