পূর্ণসংখ্যাকে দীর্ঘস্থানে রূপান্তর করা


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
আপনি কেন একটি পূর্ণসংখ্যার থেকে দীর্ঘ পর্যন্ত কাস্ট করতে পারবেন না?
মিঃমাস

@ মিঃমাস: কারণ এগুলি পৃথক রেফারেন্স ধরণের, উভয়ের প্রত্যক্ষ উপশ্রেণী Number। বা অন্যভাবে বলতে গেলে : কোন রূপান্তর নিয়মটি আপনি বিশ্বাস করেন যে আপনাকে একটি থেকে অন্যটিতে রূপান্তর করতে দেয়?
জন স্কিটি

6
ঠিক আছে. সমস্যা উত্তরাধিকার। আমি নির্ভুলতার দিক দিয়ে ভাবছি। কোনও তথ্য না হারিয়ে কোনও পূর্ণসংখ্যাকে দীর্ঘ পূর্ণসংখ্যায় রূপান্তর করা যায়। কিন্তু উত্তরাধিকার কাঠামোর এমন কোনও তথ্য নেই যা সংকলককে তা বলবে।
মিঃমাস

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

এই কোড কাজ (জাভা পরোক্ষভাবে unboxes Integerকরার intএবং তারপর কাস্ট longবর্তমানে অবচিত করার ক্ষণস্থায়ী আগে Long(long)কন্সট্রাকটর।
ওলে ভি ভি

53
Integer i = 5; //example

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

এটি স্ট্রিংয়ে রূপান্তরিত করার পারফরম্যান্স হিট এড়ায়। longValue()পূর্ণসংখ্যা পদ্ধতি মাত্র int- এ মূল্যের নিক্ষেপ করা হয়। Long.valueOf()পদ্ধতি VM একটি ক্যাশে মান ব্যবহার করার সুযোগ দেয়।


2
নাল হতে হবে সংরক্ষণ: দীর্ঘ l = i == নাল? নাল: i.longValue ()
Adrodoc55

19

অদ্ভুতভাবে যথেষ্ট আমি খুঁজে পেয়েছি যে আপনি যদি কোনও স্ট্রিং থেকে পার্স করেন তবে এটি কাজ করে।

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

জয়।


1
এটি আমার পক্ষে একেবারেই কোনও ধারণা রাখে না, তবে এটি একটি কবজির মতো কাজ করে। অনেক ধন্যবাদ!
বাউন্সার

33
অকারণে একটি স্ট্রিং রূপান্তর উপস্থাপন করা সত্যিই খারাপ ধারণা ... এটি করার কোনও লাভ নেই simply
জন স্কিটি

6
@ জোনস্কিটের সাথে সম্মত হন, এটির চেয়ে ভাল: অবজেক্ট আই = 10; লং এল = ((সংখ্যা) আই) .লংভ্যালু ();
Depsypher

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

পূর্ণসংখ্যার শেষে 'এল' যুক্ত করে কোনও পূর্ণসংখ্যাকে সরাসরি দীর্ঘে রূপান্তর করুন।

Long i = 1234L;

5
আমি নিশ্চিত আপনি পুরো প্রশ্নটি না পড়ে উত্তর দিয়েছেন!
ডায়াবলো

3
@ ডায়াব্লো এই প্রশ্নটি প্রথম ফলাফলটি যখন গুগলে "ইন টু লং" অনুসন্ধান করা হয়, এই উত্তরটি অন্যদের পক্ষে কার্যকর হতে পারে
দিমিত্রি ডব্লু

1
@ দিমিত্রিডাব্লু আমি এই উত্তরটি ভুল বলছি না, তবে আমি এই প্রশ্নের উত্তরটি ভুল বলছি। আপনি ঠিক বলেছেন, এটি সেই লোকদের জন্য দরকারী যারা প্রশ্নটি পড়ে না এবং কেবল উত্তরটি দেখে না।
ডায়াবলো

7

পূর্ণসংখ্যা শূন্য না হলে

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

iএকটিতে স্বয়ংক্রিয়ভাবে টাইপকাস্ট হবে long

valueOfপরিবর্তে ব্যবহার করা newকম্পাইলার বা জেভিএম দ্বারা এই মানটিকে (যদি এটি ছোট হয়) ক্যাশে করার অনুমতি দেয়, যার ফলে দ্রুত কোড আসে।


আমি একটি Long.valueOf (পূর্ণসংখ্যা i) পদ্ধতিটি খুঁজে পাচ্ছি না, কেবলমাত্র আমি খুঁজে পেয়েছি মানগুলি (দীর্ঘ l), ভ্যালুআফ (স্ট্রিং গুলি) এবং ভ্যালুওফ (স্ট্রিংস, ইনট রেডিক্স)। জাভা 8 এবং জাভা 9 ডক্সের জন্য চেক করা হয়েছে।
অ্যান্ডি

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

লং টাইপের তালিকার ক্ষেত্রে প্রতিটি সংখ্যার মানের শেষে এল যুক্ত করা

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

-1

জ্যাকসন দ্বারা রূপান্তর করার চেষ্টা করুন

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

ডাউনভোটেড কারণ এটি অবশ্যই সর্বোত্তম উত্তর নয়: এই সমাধানটি অযথা জটিলতা, পারফরম্যান্সের ওভারহেড যোগ করে এবং একটি অতিরিক্ত গ্রন্থাগার (জ্যাকসন) প্রয়োজন
নিকগ্রাইন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.