जावा विधि हस्ताक्षर के बाद अजीब "[]"


119

मैंने आज कुछ जावा कोड को देखा, और मुझे कुछ अजीब वाक्यविन्यास मिले:

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

मैंने सोचा कि संकलन नहीं कर सकता और जो मैं सोचता था उसे ठीक करना चाहता था एक टाइपो, लेकिन फिर मुझे याद आया कि जावा कंपाइलर ने वास्तव में इसे स्वीकार किया था!

क्या कोई कृपया मुझे यह समझने में मदद कर सकता है कि इसका क्या मतलब है? क्या यह कार्यों की एक सरणी है?


10
वाह, यह अजीब बात है ...; डी
नन्ने १५'११


2
Craziest ... बात मैं कभी देखा है। वे कहते हैं कि रूबी में बहुत जादू है, उस रूबी को खाओ!
एडॉप्टर

16
किसी फ़ंक्शन के हस्ताक्षर की तुलना में दूर से भी अजीब नहीं दिखता है जो सी में कार्य करने के लिए पॉइंटर्स की सरणी के लिए एक पॉइंटर लौटाता है:
कोस

जवाबों:


111

यह एक विधि है जो एक रिटर्न देती है int[]

जावा भाषा विशिष्टता (8.4 विधि घोषणाएँ)

जावा प्लेटफ़ॉर्म के पुराने संस्करणों के साथ संगतता के लिए, एक विधि के लिए एक घोषणा फॉर्म जो एक सरणी देता है, पैरामीटर सूची के बाद सरणी प्रकार की घोषणा को बनाने वाले खाली ब्रैकेट जोड़े (कुछ या सभी) को रखने की अनुमति है।

यह अश्लील उत्पादन द्वारा समर्थित है:

MethodDeclarator :
    MethodDeclarator []

लेकिन नए कोड में उपयोग नहीं किया जाना चाहिए।


92
सबसे अच्छी बात यह है कि यह कुछ या सभी का है । इसलिए यदि आपके पास एक 3-आयामी सरणी के ints को वापस करने की विधि है, तो आप ऐसा कर सकते हैं: public int[] foo()[][] {और लोगों की आंखों को रक्तस्रावी बना सकते हैं ।
कोवान

मुझे यह कहना है कि मैं उस कोड को देखने के बाद से जोर से हंस रहा हूं! :-D
sdlins

20

यह एक मजेदार सवाल है। जावा में आप कह सकते हैं int[] a;, साथ ही साथ int a[];
इस दृष्टिकोण से, एक ही परिणाम प्राप्त करने के लिए बस []
और आगे बढ़ने की जरूरत है public int[] get() {
अभी भी ऐसा लगता है कि कोड एक पर्यवेक्षक से आया है ...


2
एक प्रेक्षक से? एक सी प्रोग्रामर से अधिक संभावना है (आप किसी सरणी को नहीं लौटा सकते, लेकिन सरणी प्रकार के लिए एक सूचक - हां .. और यह समान दिखाई देगा)।
कोस

4
@Kos: आप यह क्यों मान रहे हैं कि एक ऑबफ्यूज़र और सी प्रोग्रामर दो अलग-अलग चीजें होनी चाहिए? कई बार वे नहीं होते हैं!
लीई

10

जैसा कि एक सी टैग है, मैं बताता हूं कि सी और सी ++ में एक समान (लेकिन समान नहीं) संकेतन संभव है:

यहां फ़ंक्शन f10 पॉइंट की एक सरणी के लिए एक पॉइंटर लौटाता है।

int tab[10];

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

जावा को बस स्टार और कोष्ठक की जरूरत नहीं है।


वहाँ एक समारोह के लिए एक आसान वाक्यविन्यास एक आयामी सरणी के लिए एक सूचक लौट रहा है? (न सिर्फ एक इंट *)
ted

वास्तव में, मुझे जोड़ना चाहिए, पीसी सीधे f()[]कुछ का मतलब का समर्थन करता है जैसे (*f())
AnArrayOfFunctions

4

जावा का सिंटैक्स निम्नलिखित के लिए अनुमति देता है:

int[] intArr = new int[0];

और भी

int intArr[] = new int[0];

जो सी-स्टाइल सिंटेक्स से आने वाली अधिक फेमस लगती है।

इसलिए भी, एक फ़ंक्शन के साथ, नाम पहले या बाद में आ सकता है], और प्रकार अभी भी int [] है


1
यह वास्तव में मुझे गुस्सा दिलाता है क्योंकि यह वास्तव में int होना चाहिए [] क्योंकि यह एक सरणी का प्रकार है, इसके नाम का हिस्सा नहीं है। मेरे uni java courseworks को लिखने वाला पोस्टग्रेड उसके कोड में हर समय विपरीत होता है, इसका भयानक!
danpalmer

1
@danpalmer, मैं सहमत हूँ, हालांकि अपने आप को एसी प्रोग्रामर के जूते में डाल दिया, जो उसके नाम पर int नाम लिखने के लिए उसके खून में है। वैसे भी, इसकी इतनी बड़ी बात नहीं है, भाषा दोनों का समर्थन करती है और अधिकांश जावा प्रोग्रामर int [] सम्मेलन का उपयोग करते हैं, इसलिए एक कष्टप्रद पोस्टग्रेड या इसके दो दुर्लभ के अलावा। कौन जानता है, यह आपके पक्ष में भी काम कर सकता है यदि वे आपके अंतिम में इस तरह का प्रश्न पूछते हैं
डेविन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.