लंबे समय के लिए पूर्णांक परिवर्तित


108

मुझे प्रतिबिंब का उपयोग करके किसी क्षेत्र का मान प्राप्त करने की आवश्यकता है। ऐसा होता है कि मैं हमेशा निश्चित नहीं हूं कि क्षेत्र का डेटाटाइप क्या है। उसके लिए, और कुछ कोड दोहराव से बचने के लिए मैंने निम्नलिखित विधि बनाई है:

@SuppressWarnings("unchecked")
private static <T> T getValueByReflection(VarInfo var, Class<?> classUnderTest, Object runtimeInstance) throws Throwable {
  Field f = classUnderTest.getDeclaredField(processFieldName(var));
  f.setAccessible(true);
  T value = (T) f.get(runtimeInstance);

  return value;
}

और इस विधि का उपयोग करें:

Long value1 = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);

या

Double[] value2 = getValueByReflection(inv.var2(), classUnderTest, runtimeInstance);

समस्या यह है कि मुझे यह नहीं लग सकता Integerहै Long:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long

क्या इसे प्राप्त करने का एक बेहतर तरीका है?

मैं जावा 1.6 का उपयोग कर रहा हूं।

जवाबों:


91

नहीं, आप डाली नहीं कर सकते Integerकरने के लिए Long, भले ही आप से परिवर्तित कर सकते हैं intकरने के लिए long। एक व्यक्तिगत मूल्य के लिए जिसे एक संख्या के रूप में जाना जाता है और आप दीर्घ मूल्य प्राप्त करना चाहते हैं, आप इसका उपयोग कर सकते हैं:

Number tmp = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);
Long value1 = tmp.longValue();

सरणियों के लिए, यह मुश्किल हो जाएगा ...


सरणियों के लिए मैं Number[]उचित रूप से टाइप की गई सरणी बनाने के लिए इस पर एक और एक लूप का उपयोग कर सकता हूं , है ना?
टियागो वेलोसो

@ टियागो: यह इस बात पर निर्भर करता है कि विधि वास्तव में क्या है । यह double[]उदाहरण के लिए काम नहीं करेगा , लेकिन एक के लिए काम करेगाDouble[]
जॉन स्कीट

7
आप एक इंटीजर से एक लंबे समय तक क्यों नहीं डाल सकते हैं?
मि। मास

@MMMas: क्योंकि वे अलग-अलग संदर्भ प्रकार हैं, दोनों के प्रत्यक्ष उपवर्ग Number। जो रूपांतरण नियम आप विश्वास है: या दूसरे शब्दों में कहें लिए करता है आप दूसरे के लिए एक से बदलने देते?
जॉन स्कीट

6
ठीक। समस्या विरासत की है। मैं सटीक के संदर्भ में सोच रहा हूं। बिना जानकारी खोए एक पूर्णांक को एक लंबे पूर्णांक में परिवर्तित किया जा सकता है। लेकिन इनहेरिटेंस संरचना में ऐसी कोई जानकारी नहीं है जो संकलक को बताएगी कि।
MrMas

134

सीधे शब्दों में:

Integer i = 7;
Long l = new Long(i);

10
NPE फेंक दिया जाता है अगर इंटेगर शून्य है
लक्स

2
intमूल्यों के लिए काम करता है ।
dARKpRINCE

11
Long.valueof का उपयोग किया जाना चाहिए: stackoverflow.com/questions/2974561/new-integer-vs-valueof
luckyluke

यह कोड काम करता है (जावा स्पष्ट रूप से अब वंचित किए गए कंस्ट्रक्टर को पास करने से पहले कास्ट करता Integerहै intऔर उसके बाद आता है ।longLong(long)
ओले वीवी

53
Integer i = 5; //example

Long l = Long.valueOf(i.longValue());

यह एक स्ट्रिंग में परिवर्तित करने के प्रदर्शन हिट से बचा जाता है। longValue()पूर्णांक में विधि सिर्फ पूर्णांक मूल्य का एक कलाकार हैं। Long.valueOf()विधि वीएम एक कैश्ड मान का उपयोग करने का मौका देता है।


2
अशक्त होने के लिए बचाएं: लंबा l = i == अशक्त? null: i.longValue ()
Adrodoc55

19

विचित्र रूप से पर्याप्त मैंने पाया कि यदि आप एक स्ट्रिंग से पार्स करते हैं तो यह काम करता है।

 int i = 0;
 Long l = Long.parseLong(String.valueOf(i));
 int back = Integer.parseInt(String.valueOf(l));

जीत।


1
यह मेरे लिए बिल्कुल कोई मतलब नहीं है, लेकिन यह एक आकर्षण की तरह काम करता है। आपका बहुत बहुत धन्यवाद!
बाउंसर

33
बिना किसी कारण के एक स्ट्रिंग रूपांतरण का परिचय वास्तव में एक बुरा विचार है ... ऐसा करने में बस कोई लाभ नहीं है।
जॉन स्कीट

6
@JonSkeet से सहमत, इससे बेहतर: ऑब्जेक्ट i = 10; लॉन्ग l = ((नंबर) i) .longValue ();
२०:०३

1
यह विधि ठीक काम करती है लेकिन अपेक्षाकृत धीमी गति से होती है और इसे करने के अन्य तरीकों की तुलना में अधिक मेमोरी का उपयोग करती है ...
क्रिस्पी

1
एक फ्रंट एंड डेवलपर परिप्रेक्ष्य से बहुत अच्छा लग रहा है
एज़ेवेई

8

इंटीग्रेटिंग को लॉन्ग वेरी सिंपल और कई तरीकों से उस
उदाहरण को परिवर्तित करना 1

 new Long(your_integer);

उदाहरण 2

Long.valueOf(your_integer); 

उदाहरण 3

Long a = 12345L;

उदाहरण 4
यदि आपके पास पहले से ही इंटर्जर के रूप में टाइप किया गया है तो आप ऐसा कर सकते हैं:

Integer y = 12;
long x = y.longValue();

7

पूर्णांक के अंत में 'L' जोड़कर एक पूर्णांक को लंबे समय तक सीधे रूप में परिवर्तित करें।

Long i = 1234L;

5
मुझे यकीन है कि आपने पूरे प्रश्न को पढ़े बिना उत्तर दिया है!
डियाब्लो

3
@Diablo यह प्रश्न Google पर "int to long" खोजते समय पहला परिणाम है, यह उत्तर दूसरों के लिए उपयोगी हो सकता है
Dimitri W

1
@DimitriW मैं यह नहीं कह रहा हूं कि यह उत्तर गलत है, लेकिन मैं कह रहा हूं कि इस प्रश्न का उत्तर गलत है। आप सही हैं, यह उन लोगों के लिए उपयोगी है जो प्रश्न नहीं पढ़ते हैं और केवल उत्तर को देखते हैं।
डियाब्लो

7

अगर इंटेगर शून्य नहीं है

Integer i;
Long long = Long.valueOf(i);

iअपने आप टाइपकास्ट हो जाएगा long

संकलक या जेवीएम द्वारा इस मूल्य के कैशिंग (यदि इसका छोटा है) के valueOfबजाय का उपयोग करने की newअनुमति मिलती है, जिसके परिणामस्वरूप तेज कोड होता है।


मुझे एक Long.valueOf (पूर्णांक i) विधि नहीं मिल रही है, केवल वही जो मुझे मिल रहे हैं वे हैं valueOf (long l), valueOf (String s) और valueOf (String s, int radix)। Java8 और Java9 डॉक्स के लिए जाँच की गई।
एंडी

1
पूर्णांक को मुख्य रूप से एक आदिम लंबे प्रकार में परिवर्तित किया जाता है।
हारीट्रांसलैशन




1

वर्ग में intचर से longप्रकार का एक पार्सर शामिल है Integer। यहाँ एक उदाहरण है:

int n=10;
long n_long=Integer.toUnsignedLong(n);

आप आसानी से एक विधि बनाने के लिए इस में निर्मित समारोह का उपयोग कर सकते है कि से पार्स intकरने के लिए long:

    public static long toLong(int i){
    long l;
    if (i<0){
        l=-Integer.toUnsignedLong(Math.abs(i));
    }
    else{
        l=Integer.toUnsignedLong(i);
    }
    return l;
}

0

यह अशक्त है

Number tmp = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);
Long value1 = tmp == null ? null : tmp.longValue();

0

यदि आपको अपने नंबर की सटीक कक्षा ( पूर्णांक , लंबी , दोहरी , जो कुछ भी) नहीं पता है , तो आप नंबर पर डाल सकते हैं और इसके लिए अपना लंबा मूल्य प्राप्त कर सकते हैं:

Object num = new Integer(6);
Long longValue = ((Number) num).longValue();

-1

लंबी सूची के मामले में, प्रत्येक पूर्णांक मान के अंत में L जोड़ना

List<Long> list = new ArrayList<Long>();
list  = Arrays.asList(1L, 2L, 3L, 4L);

-1

जैक्सन द्वारा ConvertValue करने का प्रयास करें

ObjectMapper mapper = new ObjectMapper()
Integer a = 1;
Long b = mapper.convertValue(a, Long.class)

डाउनवोटेड क्योंकि यह निश्चित रूप से सबसे अच्छा जवाब नहीं है: इस समाधान में अनावश्यक जटिलता, प्रदर्शन ओवरहेड और अतिरिक्त पुस्तकालय (जैक्सन) की आवश्यकता है
निकोग्रीन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.