2013-04-21 3 views
63

क्या auto जावा में वेरिएबल टाइप है जैसे आपके पास सी ++ है?क्या जावा में ऑटो टाइपिंग है?

एक उदाहरण:

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(); 

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

+0

मूल प्रकारों को छोड़कर सब कुछ प्रकार के एक चर को सौंपा जा सकता 'Object', कुछ कार्यों के लिए हां, तो आप उपयोग कर सकते हैं' Object' जहाँ आप चाहते हैं 'auto'। –

+1

कोई जावा में ऐसा कोई चर नहीं है –

+0

@ Zyx2000: फिर, यह ऑब्जेक्ट के 'to_string' फ़ंक्शन का उपयोग करेगा, न कि वास्तविक वस्तु प्रश्न में, है ना? –

उत्तर

22

उत्तर से पहले प्रश्न संपादित किया गया था:

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

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

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

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

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

+0

सच है, लेकिन फिर ऑब्जेक्ट प्रश्न में वास्तविक वस्तु के बजाय 'to_string' फ़ंक्शन का उपयोग नहीं करेगा? –

+9

@GamesBrainiac No, विधि कॉल हमेशा जावा में polymorphic हैं। हालांकि, कई अन्य चीजें (जैसे ओवरलोड रिज़ॉल्यूशन, या 'ऑब्जेक्ट' पर परिभाषित कोई भी ऑपरेशन) इस तरह नहीं किया जा सकता है। यह वास्तव में एक अच्छा जवाब नहीं है, यह केवल काम करने के लिए होता है क्योंकि प्रश्न में उदाहरण कमजोर है। – delnan

+1

फिर आपको इसे अपने मूल प्रकार में डालना होगा। – NINCOMPOOP

8

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

+0

या 'हैशकोड' की गणना, या कक्षा के नाम एकत्रित करना, या ... आपको विचार मिला;) सूची छोटी है, हालांकि। [ऑब्जेक्ट क्लास 'डॉक्स] देखें (http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html) (टिप्पणी शुरुआती लोगों के लिए है, मुझे यकीन है कि आप इसे साइमन सी जानते थे) –

20

जावा 7 diamond syntax

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

परिचय वर्ष जावा की तुलना में

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

महत्वपूर्ण पाठक देखेंगे कि इस नए वाक्य रचना के लिए लेखन के साथ मदद नहीं करता है मूल प्रश्न में लूप। ऐसा लगता है कि यह सही और पूरी तरह से जानबूझकर है। ओरेकल के बग डेटाबेस को उद्धृत करने वाले दूसरे उत्तर को देखें।

+2

सच है, लेकिन वह (और मैं) जो खोज रहे हैं वह कुछ ऐसा है: 'ऑटो पूर्णांकबॉक्स = नया बॉक्स ();', आमतौर पर इसका उपयोग उन कार्यों से वापसी मूल्य प्राप्त करने के लिए किया जाता है जिन्हें कभी-कभी 'हैश मैप < स्ट्रिंग, लिंक्डलिस्ट <ऑपरेशन, सेट >> ' –

+1

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

14

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

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

यह एक शुद्ध जावा समाधान नहीं है,:

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

जो दोनों के भी विधि संदर्भों का उपयोग सरल किया जा सकता नीचे जादू संकलन और सी ++ में auto कीवर्ड को बहुत बहुत समान काम करने के लिए

List<String> strList = Arrays.asList("foo", "bar", "baz"); 
for (val s: strList){ 
    System.out.println(s.length()); 
} 
3

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

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

से JDK Enhancement Proposals 286

+0

हां यह एक सुधार है, लेकिन वह कीवर्ड केवल स्थानीय चर के साथ काम कर सकता है। सी ++ ऑटो प्रकार अनुमान के रूप में शक्तिशाली नहीं है – texasbruce

संबंधित मुद्दे