“ []” แปลก ๆ หลังลายเซ็นวิธี Java


119

วันนี้ฉันดูโค้ด Java และพบไวยากรณ์แปลก ๆ :

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

ฉันคิดว่าไม่สามารถรวบรวมและต้องการแก้ไขสิ่งที่ฉันคิดว่าพิมพ์ผิด แต่แล้วฉันก็จำได้ว่าคอมไพเลอร์ Java ยอมรับมันจริงๆ!

ใครช่วยได้โปรดช่วยฉันเข้าใจความหมาย เป็นอาร์เรย์ของฟังก์ชันหรือไม่?


10
ว้าวนั่นคือ .. แปลก ... ; D
แน

6
ดูความคิดเห็นของstackoverflow.com/questions/1995113/strangest-language-feature/…
josefx

2
บ้าที่สุด ... สิ่งที่ฉันเคยเห็น พวกเขาบอกว่าทับทิมมีความมหัศจรรย์มากกินทับทิมนั่น!
IAdapter

16
ไม่ได้ดูแปลก ๆ จากระยะไกลเมื่อเทียบกับลายเซ็นของฟังก์ชันที่ส่งกลับตัวชี้ไปยังอาร์เรย์ของพอยน์เตอร์ไปยังฟังก์ชันใน C. :)
Kos

คำตอบ:


111

เป็นวิธีที่ส่งคืนint[]ไฟล์.

ข้อกำหนดภาษา Java (การประกาศวิธี 8.4)

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

สิ่งนี้ได้รับการสนับสนุนโดยการผลิตที่ล้าสมัย:

MethodDeclarator :
    MethodDeclarator []

แต่ไม่ควรใช้ในรหัสใหม่


92
บิตที่ดีที่สุดของที่นี่คือว่ามันเป็นบางส่วนหรือทั้งหมด ดังนั้นหากคุณมีวิธีการคืนค่า ints แบบ 3 มิติคุณสามารถทำได้: public int[] foo()[][] {และทำให้ดวงตาของผู้คนตกเลือด
Cowan

ต้องบอกว่าขำลั่นตั้งแต่เห็นรหัสนั่นเลย! :-D
sdlins

20

นั่นเป็นคำถามที่ตลก ใน java คุณสามารถพูดint[] a;ได้เช่นเดียวกับint a[];.
จากมุมมองนี้เพื่อให้ได้รับผลเดียวกันก็ต้องย้ายและการเขียน[]
ดูเหมือนว่ารหัสมาจาก obfuscator ...public int[] get() {


2
จาก obfuscator? มีแนวโน้มมากขึ้นจากโปรแกรมเมอร์ C (คุณไม่สามารถส่งคืนอาร์เรย์ได้ แต่ตัวชี้ไปยังประเภทอาร์เรย์ - ใช่ .. และมันจะดูคล้ายกัน)
Kos

4
@Kos: ทำไมคุณถึงบอกเป็นนัยว่า obfuscator และโปรแกรมเมอร์ C ต้องเป็นสองสิ่งที่แตกต่างกัน? หลายครั้งที่พวกเขาไม่ใช่!
Lii

10

เนื่องจากมีแท็ก C ฉันจะชี้ให้เห็นว่าสัญกรณ์ที่คล้ายกัน (แต่ไม่เหมือนกัน) เป็นไปได้ใน C และ C ++:

ที่นี่ฟังก์ชันfจะส่งกลับตัวชี้ไปยังอาร์เรย์ 10 ints

int tab[10];

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

Java ไม่จำเป็นต้องใช้ดาวและวงเล็บ


มีไวยากรณ์ที่ง่ายกว่าสำหรับฟังก์ชันที่ส่งคืนตัวชี้ไปยังอาร์เรย์มิติ n หรือไม่? (ไม่ใช่แค่ int *)
ted

ที่จริงฉันต้องเพิ่ม pcc สนับสนุนf()[]ความหมายโดยตรงเช่น(*f()).
AnArrayOfFunctions

4

ไวยากรณ์ของ java อนุญาตให้มีสิ่งต่อไปนี้:

int[] intArr = new int[0];

และนอกจากนี้ยังมี

int intArr[] = new int[0];

ซึ่งดูคุ้นเคยมากขึ้นมาจากไวยากรณ์สไตล์ c

ดังนั้นด้วยฟังก์ชันชื่อสามารถมาก่อนหรือหลัง [] และประเภทยังคงเป็น int []


1
สิ่งนี้ทำให้ฉันรำคาญจริงๆเพราะมันควรจะเป็น int [] เพราะความจริงแล้วอาร์เรย์เป็นส่วนหนึ่งของประเภทไม่ใช่ส่วนหนึ่งของชื่อมัน postgrad ที่เขียนหลักสูตร uni java ของฉันทำตรงกันข้ามตลอดเวลาในรหัสของเขามันน่ากลัว!
danpalmer

1
@danpalmer ฉันเห็นด้วยแม้ว่าจะใส่ตัวเองในรองเท้าของโปรแกรมเมอร์ ac ที่มีเลือดไหลในการเขียนชื่อ int [] อย่างไรก็ตามมันไม่ใช่เรื่องใหญ่เช่นนี้ภาษารองรับทั้งโปรแกรมเมอร์จาวาส่วนใหญ่ใช้อนุสัญญา int [] ดังนั้นนอกเหนือจาก postgrad ที่น่ารำคาญหรือสองอย่างที่หายาก ใครจะรู้มันอาจจะได้ผลถ้าพวกเขาถามคำถามแบบนี้ในรอบสุดท้ายของคุณ
davin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.