क्या जावा में ऑटो टाइप इंफ़ेक्शन है?


113

क्या autoजावा में एक वैरिएबल प्रकार है जैसे आपके पास C ++ में है?

एक उदाहरण:

for ( auto var : object_array)
    std::cout << var << std::endl;

for( auto var : object_array)
    var.do_something_that_only_this_particular_obj_can_do();

मुझे पता है कि जावा में लूप के लिए एक बढ़ाया है, लेकिन क्या एक ऑटो है? यदि नहीं, तो क्या ऐसा करने के लिए एक हैक है? मैं C ++ 11 में नई सुविधा की बात कर रहा हूं


1
मौलिक प्रकारों को छोड़कर सब कुछ प्रकार के एक चर को सौंपा जा सकता है Object, इसलिए कुछ कार्यों के लिए, आप Objectजहां चाहें वहां उपयोग कर सकते हैं auto
Zyx 2000

1
no java का ऐसा कोई वैरिएबल नहीं है
अलेक्सी बुल्गक

@ Zyx2000: फिर, यह ऑब्जेक्ट के to_stringफ़ंक्शन का उपयोग करेगा , और प्रश्न में वास्तविक ऑब्जेक्ट नहीं, यह नहीं होगा?
खेलों ब्रेनियाक

2
@ गेमब्रेनियक: नहीं, यह ओवरराइड संस्करण का उपयोग करेगा, यदि कोई मौजूद है।
केपील

2
जिस शब्द की आप तलाश कर रहे हैं, वह "ऑटो" नहीं है, यह "प्रकार का निष्कर्ष" है। जावा में टाइप इंट्रेंस के बारे में काफी कुछ सवाल हैं, हालांकि वे ज्यादातर जेनरिक का उल्लेख करते हैं, इसलिए मुझे यकीन नहीं है कि कैसे एक डुप्लिकेट

जवाबों:


49

उत्तर से पहले सवाल था संपादित :

नहीं autoजावा में कोई चर प्रकार नहीं है । उसी लूप को प्राप्त किया जा सकता है:

for ( Object var : object_array)
  System.out.println(var);

जावा में स्थानीय चर होते हैं, जिनका दायरा उस खंड के भीतर होता है जहां उन्हें परिभाषित किया गया है। C और C ++ के समान, लेकिन कोई ऑटो या रजिस्टर कीवर्ड नहीं है। हालांकि, जावा कंपाइलर स्पष्ट रूप से आरंभिक स्थानीय चर के उपयोग की अनुमति नहीं देगा और संकलन त्रुटि देगा (सी और सी ++ के विपरीत जहां कंपाइलर आमतौर पर केवल एक चेतावनी देगा)। सौजन्य: विकिपीडिया

नहीं, जावा में C ++ की तरह कोई मेनस्ट्रीम टाइप-इनफेरेंस नहीं है। एक RFE था लेकिन इसे "ठीक नहीं होगा" के रूप में बंद कर दिया गया था, कारण दिया गया था:

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


10
@GamesBrainiac नहीं, जावा में विधि कॉल हमेशा बहुरूपी होती हैं। हालाँकि, कई अन्य चीजें (जैसे अधिभार संकल्प, या किसी भी ऑपरेशन को परिभाषित Objectनहीं किया जाता है) इस तरह से नहीं किया जा सकता है। यह वास्तव में एक अच्छा जवाब नहीं है, यह केवल काम करने के लिए होता है क्योंकि प्रश्न में उदाहरण कमजोर है।

10
यह प्रश्न C ++ 11 में टाइप इंफ़ेक्शन के बारे में है, न कि autoC और प्री-C ++ 11 के पुराने उपयोग के बारे में । आपका संपादन विषय बंद है।

4
"ऐसा नहीं है कि मेरा क्या मतलब है, एक बार जब आप इसे किसी ऑब्जेक्ट पर लिखते हैं, तो यह आपको ऑब्जेक्ट का to_string प्रदान करेगा" गलत। बिलकुल 100% झूठा।
लुई वासरमैन

140
"मनुष्य अतिरेक से लाभान्वित होता है।" यह सच है। हर सुबह मैं उठता हूं और सोचता हूं कि "मैं अपने कोड को कैसे अधिक अनावश्यक बना सकता हूं?"। फायदे की वजह से।
इफफर

2
इसके अलावा यह उत्तर अप्रचलित है क्योंकि varजावा 9.
6infinity8

69

हो सकता है कि जावा 10 में varकीवर्ड के माध्यम से आप (और मैं) चाहते हैं ।

var list = new ArrayList<String>();  // infers ArrayList<String>
var stream = list.stream();          // infers Stream<String>

से JDK संवर्धन प्रस्ताव 286


अद्यतन: हां, उस सुविधा ने इसे जावा 10 रिलीज़ में बनाया!


6
हां इसका सुधार है, लेकिन यह कीवर्ड केवल स्थानीय चर के साथ काम कर सकता है। C ++ ऑटो प्रकार के निष्कर्ष के रूप में शक्तिशाली नहीं है
टेक्ससब्रूस

7
माइनर नाइट-पिक: varएक कीवर्ड नहीं है! से JLS : "वर एक कीवर्ड, बल्कि एक स्थानीय चर घोषणा के प्रकार के रूप में विशेष अर्थ के साथ एक पहचानकर्ता नहीं है।" इस प्रकार, कीवर्ड के विपरीत, आपको चर या विधि "var" कॉल करने से रोकने के लिए कुछ भी नहीं है।
क्लिटोस काइराकौ

2
अच्छी बात @KlitosKyriacou। फिर भी, यदि मैं 'कीवर्ड' को 'आइडेंटिफायर' से बदलने की कल्पना करता हूं - या यहां तक ​​कि 'विशेष पहचान वाले' के रूप में 'स्थानीय वेरिएबल डिक्लेरेशन' के प्रकार के साथ 'आइडेंटिफ़ायर' - तो उत्तर मुझे लगता है कि कम स्पष्ट होगा। लेकिन हाँ, varवास्तव में कीवर्ड की सूची में नहीं है।
सॉरीमिसजैकसन

यह केवल पिछड़े अनुकूलता के लिए एक खोजशब्द नहीं है। इस तथ्य के अलावा कि आपके पास इस नाम के साथ एक पहचानकर्ता हो सकता है, var एक कीवर्ड की भूमिका निभाता है।
फेसटस

25

जावा 7 डायमंड सिंटैक्स का परिचय देता है

Box<Integer> integerBox = new Box<>(); // Java 7

पुराने जावा की तुलना में

Box<Integer> integerBox = new Box<Integer>(); // Before Java 7

आलोचनात्मक पाठक ध्यान देंगे कि यह नया वाक्यविन्यास मूल प्रश्न में छोरों के लिए लिखने में मदद नहीं करता है। यह सही और पूरी तरह से जानबूझकर लगता है। अन्य उत्तर देखें जो Oracle के बग डेटाबेस का हवाला देता है।


4
यह सच है, लेकिन वह (और मैं) जिस चीज की तलाश कर रहे हैं वह कुछ auto integerBox = new Box<Integer>();इस तरह है: यह आमतौर पर एक फ़ंक्शन से रिटर्न वैल्यू प्राप्त करने के लिए उपयोग किया जाता है जिसे कभी-कभी जटिल किया जा सकता हैHashMap<String, LinkedList<Operation, Set<Integer>>>
Roee Gavirel

1
यह चिंता ठीक वही है जो मैंने कोड नमूनों के बाद संबोधित की थी। निष्कर्ष यह था कि जावा ऐसा नहीं करता है, और यह उद्देश्य पर है।
टार्च

18

जावा 8 में, आप प्रकार की घोषणा से बचने के लिए लैम्ब्डा प्रकार के प्रयोग का उपयोग कर सकते हैं। प्रश्नकर्ता के उदाहरणों के अनुरूप होगा:

object_array.forEach(var -> System.out.println(var)); 
object_array.forEach(var -> var.do_something_that_only_this_particular_obj_can_do());

विधि संदर्भों का उपयोग करके दोनों को सरल भी बनाया जा सकता है:

object_array.forEach(System.out::println); 
object_array.forEach(ObjectType::do_something_that_only_this_particular_obj_can_do);

8

संक्षेप में, नहीं, कोई ऑटो प्रकार नहीं है। यदि आप सभी कर रहे हैं, हालांकि मूल्य को प्रिंट कर रहे हैं, तो आप मूल्य को केवल एक के रूप में संदर्भित कर सकते हैं Object


या कंप्यूटिंग hashCodeएस, या कक्षा के नाम एकत्र करना, या ... आपको विचार मिला;) सूची छोटी है, हालांकि। ऑब्जेक्ट क्लास 'डॉक्स देखें (टिप्पणीकारों के लिए टिप्पणी, मुझे यकीन है कि आप इसे साइमन जानते थे)
अलेक्जेंडर

4

यह एक शुद्ध जावा समाधान नहीं है, हालांकि एक पुस्तकालय जिसे लुम्बोक कहा जाता है, जोड़ना नीचे दिए गए जादू को संकलित करने में सक्षम होगा और autoकीवर्ड ++ के समान है।

List<String> strList = Arrays.asList("foo", "bar", "baz");
for (val s: strList){
    System.out.println(s.length());
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.