2012-04-30 6 views
17

बेवकूफ सवाल हो सकता है, लेकिन मैं null को long या int पर ले जाने के तरीके को कैसे पास कर सकता हूं?लंबी या int की अपेक्षा करने वाली विधि को कैसे पास किया जाए?

उदाहरण:

TestClass{ 
    public void iTakeLong(long id); 
    public void iTakeInt(int id); 
} 

अब मैं कैसे दोनों methos को अशक्त पारित कर सकते हैं:

TestClass testClass = new TestClass(); 
testClass.iTakeLong(null); // Compilation error : expected long, got null 
testClass.iTakeInt(null); // Compilation error : expected int, got null 

विचार, सुझाव?

+1

आप इस तरह के एक विधि के लिए nulls पारित करने के लिए क्यों चाहते हैं? आप यह क्या करने की उम्मीद करते हैं? –

उत्तर

31

समस्या यह है कि int और long प्राथमिक हैं। आप एक प्राइमेटिव वैल्यू पर null पास नहीं कर सकते हैं।

आप निश्चित रूप से अपने विधि हस्ताक्षर में आवरण वर्गों Integer और long और int के बजाय Long उपयोग कर सकते हैं।

+9

तो, संक्षिप्त उत्तर: आप नहीं कर सकते। –

2

आप ऐसा नहीं कर सकते हैं। जावा में आदिम प्रकार null नहीं हो सकते हैं।

आप पारित करने के लिए आप

public void iTakeLong(Long id); 
public void iTakeInt(Integer id); 
10

आप नहीं कर सकते हैं करने के लिए अपने विधि हस्ताक्षर बदलना होगा null चाहते हैं - ऐसी कोई मूल्य नहीं है। यदि आप विधि हस्ताक्षर बदल सकते हैं, तो आप इसके बजाय संदर्भ प्रकार ले सकते हैं। जावा प्रत्येक आदिम वर्ग के लिए अपरिवर्तनीय "आवरण" वर्ग प्रदान करता है:

class TestClass { 
    public void iTakeLong(Long id); 
    public void iTakeInt(Integer id); 
} 

अब आप एक अशक्त संदर्भ या आवरण प्रकार का एक उदाहरण के लिए एक संदर्भ पारित कर सकते हैं।

iTakeInt(5); 

विधि के भीतर, आप लिख सकते हैं::

if (id != null) { 
    doSomethingWith(id.intValue()); 
} 

या स्वचालित unboxing का उपयोग करें:

if (id != null) { 
    doSomethingWith(id); // Equivalent to the code above 
} 
+0

उस विधि को बदल नहीं सकता है क्योंकि उस विधि के आधार पर कड़ाई से युग्मित कार्यान्वयन किया गया है। – Rachel

+5

@ राहेल: फिर आप शून्य नहीं पारित कर सकते हैं, यह उतना आसान है जितना। 'Int 'के लिए 2^32 मान हैं - आप एक अतिरिक्त परिचय देने की कोशिश कर रहे हैं। इसका प्रतिनिधित्व करने के लिए 'int' मान में पर्याप्त बिट्स नहीं हैं। –

+0

@ जोनस्केट: हां, मुझे यह कुछ काम करने के लिए बदलना होगा ताकि मैं इस फ़ंक्शन को कॉल करने से पहले शून्य जांच कर सकूं। – Rachel

3

उपयोग आवरण कक्षाएं:

TestClass{ 
    public void iTakeLong(Long id); 
    public void iTakeInt(Integer id); 
    public void iTakeLong(long id); 
    public void iTakeInt(int id); 
} 
autoboxing आप लिखने के लिए अनुमति देगा
5

आप गैर-आदिम के लिए शून्य डाल सकते हैं रैपर वर्ग, जो संकलन करेंगे।

TestClass testClass = new TestClass(); 
testClass.iTakeLong((Long)null); // Compiles 
testClass.iTakeInt((Integer)null); // Compiles 

लेकिन, यह एक NullPointerException फेंक होगा जब मार डाला। बहुत मदद नहीं है, लेकिन यह जानना उपयोगी है कि आप रैपर को एक विधि के बराबर पास कर सकते हैं जो एक तर्क के रूप में आदिम लेता है।

4

इस पर निर्भर करता है कि आपके पास कितनी विधियां हैं, और कितने कॉल हैं, आपके पास एक और विकल्प है।

अपने कोडबेस में शून्य जांच को वितरित करने के बजाय, आप रैपर विधियों (एनबी।, नहीं प्रकार रैपर (पूर्णांक => पूर्णांक), लेकिन तरीकों जो चादर तुम्हारा):

public void iTakeLong(Long val) { 
    if (val == null) { 
     // Do whatever is appropriate here... throwing an exception would work 
    } else { 
     iTakeLong(val.longValue()); 
    } 
} 
0

के रूप में नीचे Long के लिए मूल्य Typecasting गायब संकलन त्रुटि कर देगा लेकिन अंत में NullPointerException में खत्म हो जाएगा।

testClass.iTakeLong((Long)null) 

एक समाधान आदिम long के बजाय प्रकार Long उपयोग करने के लिए है।

public void iTakeLong(Long param) { } 

अन्य समाधान का उपयोग करने org.apache.commons.lang3.math.NumberUtils

testClass.iTakeLong(NumberUtils.toLong(null)) 
संबंधित मुद्दे

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