जावा में C # 'var' कीवर्ड के बराबर क्या है?


264

C # में var कीवर्ड का एक उपयोग निहित प्रकार की घोषणा है। Var के लिए Java समकक्ष सिंटैक्स क्या है ?


4
val(या var) यदि आप एक विशेष "जावा रिप्लेसमेंट" भाषा का उपयोग करते हैं ;-)

6
@ पोस्ट: यह स्काला होगा? हम्म, यह है।
रासना

IntelliJ के लिए, मैंने इसे एक फ़ीचर रिक्वेस्ट के रूप में सबमिट किया: youtrack.jetbrains.com/issue/IDEA-102808 आईडीई वैल या वेर दिखाने के लिए कोड को ध्वस्त कर सकता है, हालांकि अंतर्निहित कोड में यह नहीं होगा।
जॉन ऑनस्टॉट

@Jon मैंने IntelliJ के लिए एक साथ कुछ हैक किया है, मेरा उत्तर देखें ।
बेलफा

3
अब इस फीचर को जावा में शामिल करने का प्रस्ताव है - openjdk.java.net/jeps/286
McGin

जवाबों:


248

वहां कोई नहीं है। काश, आपको पूर्ण प्रकार का नाम लिखना होगा।

संपादित करें: पोस्ट किए जाने के 7 साल बाद, varजावा 10 में स्थानीय चर (के साथ ) के लिए प्रकार जोड़ा गया।

संपादित करें: पोस्ट किए जाने के 6 साल बाद, नीचे से कुछ टिप्पणियां एकत्र करने के लिए:

  • C # का कारण varकीवर्ड है, क्योंकि ऐसा करने के लिए संभव है कि टाइप करें जिनका .NET में कोई नाम नहीं है। उदाहरण के लिए:

    var myData = new { a = 1, b = "2" };

    इस मामले में, एक उचित प्रकार देना असंभव होगा myData। 6 साल पहले, यह जावा में असंभव था (सभी प्रकार के नाम थे, भले ही वे बहुत ही क्रियात्मक और अनजान थे)। मुझे नहीं पता कि यह इस बीच बदल गया है या नहीं।

  • varके रूप में ही नहीं है dynamicvariables अभी भी 100% सांख्यिकीय रूप से टाइप किए गए हैं। यह संकलित नहीं होगा:

    var myString = "foo";
    myString = 3;
  • varसंदर्भ से प्रकार स्पष्ट होने पर भी उपयोगी है। उदाहरण के लिए:

    var currentUser = User.GetCurrent();

    मैं कह सकता हूं कि जिस भी कोड के लिए मैं जिम्मेदार हूं, उसमें currentUserएक Userया व्युत्पन्न वर्ग है। जाहिर है, अगर आपका User.GetCurrentइंट्रस्ट वापसी का है, तो शायद यह आपके लिए एक बाधा है।

  • इससे कोई लेना-देना नहीं है var, लेकिन यदि आपके पास अजीब विरासत पदानुक्रम हैं, जहां आप अन्य विधियों (जैसे new public void DoAThing()) के साथ छाया वाले तरीके हैं , तो यह न भूलें कि गैर-आभासी तरीके उस प्रकार से प्रभावित होते हैं जैसे वे डाले जाते हैं।

    मैं एक वास्तविक विश्व परिदृश्य की कल्पना नहीं कर सकता जहां यह अच्छे डिजाइन का संकेत हो, लेकिन यह आपके उम्मीद के मुताबिक काम नहीं कर सकता है:

    class Foo {
        public void Non() {}
        public virtual void Virt() {}
    }
    
    class Bar : Foo {
        public new void Non() {}
        public override void Virt() {}
    }
    
    class Baz {
        public static Foo GetFoo() {
            return new Bar();
        }
    }
    
    var foo = Baz.GetFoo();
    foo.Non();  // <- Foo.Non, not Bar.Non
    foo.Virt(); // <- Bar.Virt
    
    var bar = (Bar)foo;
    bar.Non();  // <- Bar.Non, not Foo.Non
    bar.Virt(); // <- Still Bar.Virt

    जैसा कि संकेत दिया गया है, आभासी तरीके इससे प्रभावित नहीं होते हैं।

  • नहीं, varवास्तविक चर के बिना आरंभ करने का कोई गैर-अनाड़ी तरीका नहीं है ।

    var foo1 = "bar";        //good
    var foo2;                //bad, what type?
    var foo3 = null;         //bad, null doesn't have a type
    var foo4 = default(var); //what?
    var foo5 = (object)null; //legal, but go home, you're drunk

    इस मामले में, बस इसे पुराने तरीके से करें:

    object foo6;

11
@ माइक कैरन: C # में [डिफॉल्ट] नॉन-वर्चुअल कॉल और ऑपरेटर्स वर्चुअल नहीं हैं ... इसलिए सभी X और SuperX के लिए var p = new X(); p.Z()समान नहीं है SuperX p = new X(); p.Z(), भले ही X : SuperX। साथ स्थिर प्रकार के हमेशा ऊपर पहले उदाहरण में, लेकिन हमेशा दूसरे उदाहरण में। जागरूक होने के लिए एक सूक्ष्म लेकिन महत्वपूर्ण अंतर। लेकिन आपका उत्तर बहुत सही है :-)varpXSuperX

200
@ जॉन हैना: varकोड को कम स्पष्ट नहीं करता है। बल्कि मेरी राय में इसके विपरीत है। उदाहरण के लिए जब आप घोषणा करते हैं और इसे ( RadioButton radioButton = new RadioButton();) (जब) एक ही पंक्ति पर टाइप दो (या यहां तक ​​कि तीन) बार लिखते हैं ? varजब आप अपने चर का नामकरण कर रहे हैं तो आप दो बार सोचते हैं क्योंकि यह प्रकार के बजाय कार्यक्षमता पर ध्यान केंद्रित करता है (उदाहरण के लिए UserCollection collection = new userRepository.GetUsers();बल्कि स्वाभाविक रूप से अधिक बदल जाता है var users = userRepository.GetUsers();)। अगर आपको लगता varहै कि यह स्पष्ट नहीं है, तो इसका उपयोग अप्रयुक्त है।
मार्टिन ओधलीस

4
@MartinOdhelius varनिश्चित रूप से कोड का उपयोग अच्छी तरह से कर सकता है, लेकिन यह अस्पष्ट भी बना सकता है जो बुरी तरह से उपयोग किया जाता है; कई स्वरूपण विकल्पों की तरह। यह संतुलन इस बात पर निर्भर करता है कि आप अनाम वस्तुओं और जेनेरिकों का कितना उपयोग करते हैं, दोनों में से कोई भी .NET 1.0 में मौजूद नहीं है, जो इसे C♯ के पहले संस्करण में एक काल्पनिक कीवर्ड के रूप में कम उपयोगी बनाता है। मैं केवल RadioButton radioButtonएक कारखाने या सहायक विधि के मामले में एक नाम दूंगा जहां बटन के बारे में केवल एक चीज महत्वपूर्ण थी कि यह एक था RadioButton, अन्यथा यह पागलपन के साथ या उसके बिना है var
जॉन हैना

6
@ जो हन्ना: मैं एक बार आपके लिए जितना महत्वपूर्ण था var, अगर उससे अधिक नहीं, लेकिन मैंने अपनी राय बदल दी है, और शायद यह अलग-अलग राय का सवाल जितना आसान है, क्योंकि मुझे लगता है कि आप गलत हैं जब आप कहते हैं कि यह एक है कोई फर्क नहीं पड़ता कि आप अनाम वस्तुओं और जेनरिक का कितना उपयोग कर रहे हैं;) प्रकार की घोषणा सबसे अधिक बार कोड शोर है, यदि आप कोड को समझे बिना नहीं समझ सकते हैं तो कोड शायद किसी भी मामले में अस्पष्ट है।
मार्टिन ओढालियस 11

3
अनाम प्रकार के साथ आप भ्रमित कर रहे हैं var । स्वयं केवल संकलक को असाइनमेंट से प्रकार का अनुमान लगाने के लिए कहता है; यह सिंथेटिक चीनी है। मुझे पहली बार में इस पर संदेह हुआ, लेकिन मैं इसका धार्मिक रूप से उपयोग करता हूं और अभी तक ऐसे समय का सामना करना पड़ा जहां इसने भ्रम पैदा किया। यह तत्काल करते समय अतिरेक को हटाता है और संदर्भित करते समय प्रकार की जांच करने की आवश्यकता को हटाता है। var
जेएवीए के

46

यदि आप अपने प्रोजेक्ट में लोम्बोक जोड़ते हैं तो आप इसके वैल कीवर्ड का उपयोग कर सकते हैं ।

http://projectlombok.org/features/val.html


1
@ राइटफोल्ड: ऐसी वस्तुएं जिनका संदर्भ finalआवश्यक नहीं है, अपरिवर्तनीय हैं। विचार करेंfinal StringBuilder strB = new StringBuilder("My reference is final"); strB.append("I'm not immutable");
मथायस ब्रौन

1
चूंकि lombok v1.16.12 के लिए प्रायोगिक समर्थन भी है varprojectlombok.org/features/experimental/var.html
रोयल स्पिलकर

@MatthiasBraun आपका उदाहरण गलत है। इस मामले में StringBuilder वर्ग ही अपरिवर्तनीय है, आप सिर्फ विधि का उपयोग करके इसकी आंतरिक संरचना में स्ट्रिंग मान जोड़ रहे हैं, यह पूरी तरह से कानूनी है।
एंडेज़ेज मैकियसोविक

27

JEP - JDK एन्हांसमेंट-प्रस्ताव

http://openjdk.java.net/jeps/286

JEP 286: स्थानीय-परिवर्तनीय प्रकार का आविष्कार

लेखक ब्रायन गोएट्ज़

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

जावा का क्या संस्करण? 10?
पीटर मोर्टेंसन

@PeterMortensen हाँ। JEP 286 को JDK 10 में स्वीकार किया गया है और प्रकाशित किया गया है (देखें 286j under features at openjdk.java.net/projects/jdk/10 )।
जस्टिन अल्बानो

20

मैंने IntelliJ के लिए एक प्लगइन पकाया है - एक तरह से - आपको varजावा में। यह एक हैक है, इसलिए सामान्य अस्वीकरण लागू होते हैं, लेकिन यदि आप अपने जावा विकास के लिए IntelliJ का उपयोग करते हैं और इसे आज़माना चाहते हैं, तो यह https://bitbucket.org/balpha/varsity पर है


वर्तमान संपादक में घोषणा प्रकारों को मोड़ना / प्रकट करना एक कीबोर्ड शॉर्टकट होना बहुत अच्छा होगा। महान प्लगइन हालांकि।
हॉटकी

2
@hotkey यह IntelliJ के अंतर्निहित कोड तह का उपयोग करता है, जिससे आप Ctrl-Shift-NumPadPlus के साथ सब कुछ प्रकट कर सकते हैं। जब कर्सर एक लाइन पर होता है जिसमें एक मुड़ा हुआ वैरिएबल डिक्लेरेशन होता है, तो आप कर सकते हैं Ctrl-NumPadPlus और Ctrl-NumPadMinus को चालू मेथड में डिक्लेरेशन को फोल्ड / अनफोल्ड करने के लिए। सभी घोषणाओं को तह करना थोड़ा अजीब है, आपके पास सब कुछ गुना है (Ctrl-Shift-NumPadMinus) और फिर सब कुछ फिर से प्रकट करें (Ctrl-Shift-NumPadPlus)।
बाल्फा

18

20 मार्च को JDK 10 की रिलीज़ के साथ, JEP 286var में निर्दिष्ट जावा में अब एक आरक्षित प्रकार का नाम (एक कीवर्ड नहीं - नीचे देखें) शामिल है । स्थानीय चर के लिए, निम्नलिखित अब जावा 10 या उच्चतर में मान्य है:

var map = new HashMap<String, Integer>();

varजावा में आरक्षित प्रकार का नाम करने के लिए लगभग समान है varमें है कि दोनों अंतर्निहित टाइपिंग के लिए (महत्वपूर्ण अंतर के लिए नीचे देखें) की अनुमति देने के सी # में कीवर्ड। varजावा का उपयोग केवल निम्नलिखित संदर्भों में निहित प्रकार के अनुमान के लिए किया जा सकता है (जैसा कि जेईपी 286: फाइनल में गणना की गई है ):

  • शुरुआती के साथ स्थानीय चर
  • बढ़ाया लूप में अनुक्रमित
  • स्थानीय लोगों के लिए लूप में घोषित किया गया

इसलिए फ़ील्ड, रिटर्न प्रकार, वर्ग नाम या इंटरफ़ेस नाम के लिए उपयोग var नहीं किया जा सकता है। इसका तर्क स्थानीय चर को घोषित करने और परिभाषित करने में लंबे प्रकार के नामों को शामिल करने की आवश्यकता को दूर करने के लिए है, जैसा कि जेईपी 286 (ब्रायन गोएत्ज़ द्वारा लिखित) में कहा गया है :

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

var जावा में स्कोपिंग

यह ध्यान दिया जाना चाहिए कि varजावा में एक कीवर्ड नहीं है, बल्कि एक आरक्षित प्रकार का नाम है। जेईपी 286 से उद्धृत:

पहचानकर्ता संस्करण कोई कीवर्ड नहीं है; इसके बजाय यह एक आरक्षित प्रकार का नाम है। इसका मतलब यह है कि एक चर, विधि या पैकेज नाम के रूप में var का उपयोग करने वाला कोड प्रभावित नहीं होगा; एक वर्ग या इंटरफ़ेस नाम के रूप में var का उपयोग करने वाला कोड प्रभावित होगा (लेकिन ये नाम व्यवहार में दुर्लभ हैं, क्योंकि वे सामान्य नामकरण परंपरा का उल्लंघन करते हैं)।

ध्यान दें कि चूंकि varएक आरक्षित प्रकार का नाम है और कोई कीवर्ड नहीं है, फिर भी इसका उपयोग पैकेज के नाम, विधि के नाम, और चर नाम (इसके नए प्रकार-हस्तक्षेप भूमिका के साथ) के लिए किया जा सकता है। उदाहरण के लिए, निम्नलिखित varजावा में मान्य उपयोग के सभी उदाहरण हैं :

var i = 0;
var var = 1;
for (var i = 0; i < 10; i++) { /* ... */ }
public int var() { return 0; }
package var;

जेईपी 286 से उद्धृत:

यह उपचार इनिशियलाइज़र वाले स्थानीय वैरिएबल, एन्हांस्ड फ़ॉर-लूप, और स्थानीय फ़ोर-लूप में घोषित स्थानीय लोगों के लिए प्रतिबंधित होगा; यह मेथड फॉर्मल्स, कंस्ट्रक्टर फॉर्मल्स, मेथड रिटर्न टाइप्स, फील्ड्स, कैच फॉर्मल्स या किसी अन्य प्रकार के वैरिएबल फॉर्मेशन के लिए उपलब्ध नहीं होगा।

varजावा और सी में अंतर

यह varC # और जावा के बीच एक उल्लेखनीय अंतर है , इसमें निम्नलिखित शामिल हैं: varC # में एक प्रकार के नाम के रूप में उपयोग किया जा सकता है, लेकिन जावा में वर्ग नाम या इंटरफ़ेस नाम के रूप में उपयोग नहीं किया जा सकता है। C # प्रलेखन के अनुसार (स्थानीय रूप से टाइप किए गए स्थानीय प्रकार) :

यदि एक प्रकार का नाम varस्कोप है, तो varकीवर्ड उस प्रकार के नाम को हल कर देगा और एक अनुमानित टाइप किए गए स्थानीय चर घोषणा के हिस्से के रूप में नहीं माना जाएगा।

varC # में एक प्रकार के नाम के रूप में उपयोग करने की क्षमता कुछ जटिलता पैदा करती है और कुछ जटिल संकल्प नियमों का परिचय देती है, जिन्हें varजावा varमें एक वर्ग या इंटरफ़ेस नाम के रूप में अस्वीकार करके टाला जाता है । varC # में टाइप नामों की जटिलताओं के बारे में जानकारी के लिए , प्रतिबंध प्रतिबंधात्मक रूप से टाइप किए गए चर घोषणाओं पर लागू होते हैं । जावा में `var 'के लिए स्कोपिंग निर्णय के पीछे तर्क पर अधिक जानकारी के लिए, JEP 286: स्कोपिंग विकल्प देखें


क्या जावा और c # में कोई अंतर है जो आप varखेतों या रिटर्न प्रकारों के लिए उपयोग नहीं कर सकते हैं ? नोट करना क्यों महत्वपूर्ण है?
user1306322

@ user1306322 इस संदर्भ में, नहीं। varजावा में खेतों या रिटर्न प्रकारों के लिए उपयोग नहीं किया जा सकता है। यह महत्वपूर्ण है क्योंकि यह प्रतिबंध varसंदर्भ-संवेदनशील बनाता है, जहां इसका उपयोग केवल कुछ संदर्भों (स्थानीय चर) में किया जा सकता है और अन्य में नहीं। यह जावा और सी # के बीच जरूरी अंतर नहीं है, जिसे नोट किया जाना चाहिए, लेकिन varजावा में उपयोग करते समय सामान्य रूप से एक महत्वपूर्ण प्रतिबंध ।
जस्टिन अल्बानो

मैंने अभी देखा और ऐसा लगता है जैसे कि c # आप varएक क्लास नाम बना सकते हैं और इसे इस तरह से उपयोग कर सकते हैं । तकनीकी रूप से यह c # के मामले में एक "संदर्भ कीवर्ड" है, लेकिन जावा में ऐसा लगता है कि आप ऐसा नहीं कर सकते। यदि मैं गलत हूं तो मुझे सही करों।
user1306322

1
तुम सही हो। आप varजावा में क्लास नाम या इंटरफ़ेस नाम के रूप में उपयोग नहीं कर सकते (जो वैसे भी आम नहीं है), लेकिन आप इसे चर नामों, विधि नामों और पैकेज नामों के लिए उपयोग कर सकते हैं। उदाहरण के लिए, var var = 1;एक वैध जावा स्टेटमेंट है लेकिन एक वर्ग को public class var {}एक त्रुटि के रूप में घोषित करने की कोशिश कर रहा है as of release 10, 'var' is a restricted local variable type and cannot be used for type declarations:। मैंने ऊपर दिए गए उत्तर को varजावा में औचित्य पर अधिक विस्तार से जाने और varसी # में इसके अंतर के बारे में अद्यतन किया है।
जस्टिन अल्बानो

11

यह JDK 10 में समर्थित होगा। इसे शुरुआती एक्सेस बिल्ड में कार्रवाई में देखना भी संभव है ।

JEP 286 :

आरंभिक के साथ स्थानीय चर की घोषणाओं के प्रकार के विस्तार के लिए जावा भाषा को बढ़ाएं।

इसलिए अब लिखने के बजाय:

List<> list = new ArrayList<String>();
Stream<> stream = myStream();

तुम लिखो:

var list = new ArrayList<String>();
var stream = myStream();

टिप्पणियाँ:

  • varअब एक आरक्षित प्रकार का नाम है
  • स्थैतिक टाइपिंग के लिए जावा अभी भी प्रतिबद्धता है!
  • इसका उपयोग केवल स्थानीय परिवर्तनशील घोषणाओं में किया जा सकता है

यदि आप अपने स्थानीय सिस्टम पर जावा को स्थापित किए बिना इसे आजमाना चाहते हैं, तो मैंने JDK 10 के साथ एक डॉकटर चित्र बनाया :

$ docker run -it marounbassam/ubuntu-java10 bash
root@299d86f1c39a:/# jdk-10/bin/jshell
Mar 30, 2018 9:07:07 PM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
|  Welcome to JShell -- Version 10
|  For an introduction type: /help intro

jshell> var list = new ArrayList<String>();
list ==> []

3
खबरदार, आपके द्वारा प्रदान किया गया कोड (पहले / बाद var) समतुल्य नहीं है। में varउदाहरण listप्रकार का है ArrayList, न कि एक List
गिली

8

एक सरल समाधान (यह मानते हुए कि आप एक सभ्य IDE का उपयोग कर रहे हैं) हर जगह सिर्फ 'int' टाइप करना है और फिर इसे आपके लिए टाइप सेट करना है।

मैंने वास्तव में सिर्फ 'var' नामक एक वर्ग जोड़ा है, इसलिए मुझे कुछ अलग लिखने की ज़रूरत नहीं है।

कोड अभी भी बहुत क्रियात्मक है, लेकिन कम से कम आपको इसे टाइप करने की आवश्यकता नहीं है!


जब आप कहते हैं कि "सभ्य आईडीई" ग्रहण * को बाहर रखा गया है? - यह लूना में काम नहीं करता है (कम से कम जब मैंने इसके साथ कोशिश की थी int) - क्या मुझे कुछ याद आ रहा है? (*: जबकि मैं कभी भी ग्रहण को एक सभ्य आईडीई नहीं कहूँगा, मैं दूसरों के लिए न्याय नहीं कर सकता ...)
BrainSlugs83

@ BrainSlugs83 dunno मैं IDEA का उपयोग कर रहा हूं, इससे पहले वास्तव में ग्रहण का उपयोग नहीं किया गया था। क्या यह आपके लिए सही प्रकार नहीं है? मैं c # / visual studio / resharper का उपयोग कर रहा हूँ जो IDEA की तरह है सिवाय इसके कि यह वास्तव में ठीक से काम करता है! सभी जेटब्राइन्स वाले में आप किसी त्रुटि के होने पर सुझावों की एक सूची प्राप्त करने के लिए ऑल्ट-एंटर दबा सकते हैं - इसलिए int टाइप करने के लिए int एक त्रुटि का परिचय देता है, जिस पर आप टाइप कर सकते हैं और इसे टाइप करने के लिए प्राप्त कर सकते हैं
JonnyRaa

5

आप JetBrains द्वारा कोटलिन पर एक नज़र डाल सकते हैं , लेकिन यह वैल है। नहीं var।


4
कोटलिन में वैल और वर्जन हैं। वैल जावा में एक वैरिएबल फाइनल घोषित करने के लिए समान है, var पुन: असाइनमेंट की अनुमति देता है।
samlewis

5

Java 10 को लोकल वैरिएबल टाइप इंट्रेंस मिला, इसलिए अब यह varC # एक के बराबर है (जहाँ तक मेरी जानकारी है)।

यह गैर-संप्रदायी प्रकारों का भी अनुमान लगा सकता है (प्रकार जिन्हें प्रोग्रामर द्वारा उस स्थान पर नाम नहीं दिया जा सकता है; हालांकि कौन से प्रकार गैर-संप्रदाय भिन्न हैं)। उदाहरणों varऔर अनाम कक्षाओं के साथ ट्रिक्स देखें (कि आपको काम में कभी भी उपयोग नहीं करना चाहिए)

एक अंतर जो मुझे मिल सकता है वह यह है कि C # में,

यदि एक प्रकार का नाम var कार्यक्षेत्र में है, तो वह var कीवर्ड उस प्रकार के नाम को हल कर देगा और एक अनुमानित टाइप किए गए स्थानीय चर घोषणा के हिस्से के रूप में नहीं माना जाएगा।

जावा में 10 varकानूनी नाम नहीं है।


@ एलआईआई हाँ, मुझे याद नहीं है कि मैं यहाँ क्या मतलब था, हटा दिया।
एलेक्सी रोमानोव

महान! इतिहास को साफ करने के लिए मेरी टिप्पणी को हटा देंगे!
Lii

4

जावा 10 के रूप में, बराबर है ... var


क्या कोई मतभेद हैं? मेरा मतलब है कि आप इस तरह के छोटे उत्तरों को लिखने से बेहतर जानते हैं कि आपके प्रतिनिधि स्तर n के साथ क्या है। और निश्चित रूप से कुछ अंतर होना चाहिए ।
user1306322

@ user1306322 यह एक अलग सवाल है! आप जावा -10 टैग की जांच कर सकते हैं, क्योंकि इसके कई पहलुओं के बारे में पहले ही पूछा जा चुका है।
ब्रायन गोएटज़

खैर, यह सवाल है कि क्या आप इस पर ध्यान दे रहे हैं, क्योंकि यह पहले आता है और साइडबार में हर संबंधित पोस्ट से जुड़ा हुआ है। इसलिए मुझे लगता है कि यदि आप जानते हैं कि अलग-अलग प्रश्न जो इसका उत्तर देते हैं, तो आप कम से कम इसे लिंक करने में सक्षम हो सकते हैं या इसके कुछ हिस्सों को अपने उत्तर में शामिल कर सकते हैं।
user1306322

3

मुझे पता है कि यह पुराना है, लेकिन एक वर्ग वर्ग क्यों नहीं बनाया गया है और विभिन्न प्रकारों के साथ निर्माणकर्ता बना सकते हैं और इस बात पर निर्भर करते हैं कि किस प्रकार के निर्माणकर्ता आपको अलग-अलग प्रकारों के साथ संस्करण प्राप्त करते हैं। आप एक प्रकार से दूसरे में बदलने के लिए तरीकों का निर्माण भी कर सकते हैं।


3

Lombokvar का समर्थन करता है, लेकिन इसे अभी भी प्रायोगिक के रूप में वर्गीकृत किया गया है:

import lombok.experimental.var;

var number = 1; // Inferred type: int
number = 2; // Legal reassign since var is not final
number = "Hi"; // Compilation error since a string cannot be assigned to an int variable
System.out.println(number);

यहां इसका उपयोग करने से बचने के लिए एक नुकसान है IntelliJ IDEA। यह अपेक्षा के अनुरूप काम करता है, हालांकि ऑटो समापन और सब कुछ शामिल है। जब तक "नॉन-हैकी" समाधान नहीं होता है (जैसे जेईपी 286 के कारण : स्थानीय-परिवर्तनीय प्रकार का आविष्कार ), तब तक यह आपका सबसे अच्छा दांव हो सकता है।

ध्यान दें कि बिना किसी संशोधन या निर्माण के बिना valसमर्थन है ।Lomboklombok.config


2

आप जावा 10 में, लेकिन केवल स्थानीय के लिए कर सकते हैं चर के लिए, अर्थ,

आप ऐसा कर सकते हैं,

var anum = 10; var aString = "Var";

लेकिन नहीं कर सकते,

var anull = null; // Since the type can't be inferred in this case

अधिक जानकारी के लिए कल्पना की जाँच करें ।


2
यह गलत है। varगैर-प्रकार के कई प्रकारों के लिए उपयोग किया जा सकता है, जिसमें कैप्चर प्रकार, प्रतिच्छेदन प्रकार और अनाम वर्ग प्रकार शामिल हैं। और, जावा 11 के रूप में, इसे लैम्ब्डा मापदंडों पर भी लागू किया जा सकता है।
ब्रायन गोएट्ज

0

सामान्य तौर पर आप किसी भी प्रकार के लिए ऑब्जेक्ट क्लास का उपयोग कर सकते हैं, लेकिन आप बाद में टाइप कास्टिंग कर सकते हैं!

जैसे: -

Object object = 12;
    Object object1 = "Aditya";
    Object object2 = 12.12;

    System.out.println(Integer.parseInt(object.toString()) + 2);

    System.out.println(object1.toString() + " Kumar");
    System.out.println(Double.parseDouble(object2.toString()) + 2.12);

आदित्य, कृपया अपने अन्य सभी उत्तरों की जाँच करें। उनमें से कई के पास -1 और शायद एक अच्छे कारण के लिए है। अगर आपको यकीन नहीं है कि यह सही है तो बस पोस्ट न करें।
user1306322

@ user1306322 मेरे जवाब में क्या समस्या है! क्या आप विस्तृत कर सकते हैं? क्या हम सभी डेटा प्रकार के लिए ऑब्जेक्ट क्लास का उपयोग नहीं कर सकते हैं?
आदित्य कुमार

वस्तु वस्तु = 12; ऑब्जेक्ट ऑब्जेक्ट 1 = "आदित्य"; ऑब्जेक्ट ऑब्जेक्ट 2 = 12.12; System.out.println (Integer.parseInt (object.toString ()) + 2); System.out.println (object1.toString () + "कुमार"); System.out.println (Double.parseDouble (object2.toString ()) + 2.12);
आदित्य कुमार

समस्या यह है कि आप इस प्रश्न को नहीं समझ पाए हैं। सवाल यह नहीं था कि "यह काम कैसे किया जाए", लेकिन "क्या इस तरह की चीज है"। आप गलत प्रश्न का उत्तर दें। varअब आधिकारिक रूप से भाषा में इस शब्द के साथ , आपका उत्तर अब पुराने जमाने के तरीके का भी उल्लेख कर रहा है।
user1306322

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.