Tamsayı Uzunluğa Dönüştürme


108

Yansıma kullanarak bir alanın değerini elde etmem gerekiyor. Öyle oluyor ki, alanın veri türünün ne olduğundan her zaman emin olamıyorum. Bunun için ve bazı kod kopyalarını önlemek için aşağıdaki yöntemi oluşturdum:

@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;
}

Ve bu yöntemi şu şekilde kullanın:

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

veya

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

Sorun döküm görünmüyor olmasıdır Integeriçin Long:

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

Bunu başarmanın daha iyi bir yolu var mı?

Java 1.6 kullanıyorum.

Yanıtlar:


91

Hayır, döküm olamaz Integeriçin Longgelen dönüştürebilirsiniz rağmen intetmek long. Bir İçin bireysel bilinir değeri bir sayı olmak ve uzun değeri elde etmek istiyoruz şunu kullanabilirsiniz:

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

Diziler için daha yanıltıcı olacak ...


Diziler Number[]için, uygun şekilde yazılmış bir dizi oluşturmak için a ve üzerinde bir döngü kullanabilirim , değil mi?
Tiago Veloso

@Tiago: Yöntemin gerçekte ne döndüğüne bağlı. Bu bir işe yaramadığına double[]örneğin, ama olur bir iş için Double[].
Jon Skeet

7
Neden bir Tamsayıdan Long'a geçiş yapamıyorsunuz?
MrMas

@MrMas: Ayrı referans türleri oldukları için, her ikisi de doğrudan alt sınıfları Number. Eğer inanıyorsan dönüşüm kuralı: Eğer başka şekilde koymak yok sen birinden diğerine dönüştürmek izin?
Jon Skeet

6
Tamam. Sorun kalıtımdır. Hassasiyet açısından düşünüyorum. Bir tam sayı, bilgi kaybı olmadan uzun bir tam sayıya dönüştürülebilir. Ancak miras yapısı, derleyiciye bunu söyleyecek herhangi bir bilgiye sahip değildir.
MrMas


53
Integer i = 5; //example

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

Bu, bir String'e dönüştürmenin performans vuruşunu önler. longValue()Integer yöntem int değer sadece bir dökümdür. Long.valueOf()Yöntem VM önbelleğe değeri kullanmak için bir şans verir.


2
Null olarak kaydetmek için: Long l = i == null? null: i.longValue ()
Adrodoc55

19

İşin garibi, bir dizeden ayrıştırırsanız işe yaradığını buldum.

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

Kazanın.


1
Benim için kesinlikle mantıklı değil, ama bir cazibe gibi çalışıyor. Çok teşekkürler!
Bouncner

33
Sebepsiz yere bir dizi dönüşümü sunmak gerçekten kötü bir fikirdir ... Bunu yapmanın hiçbir faydası yoktur.
Jon Skeet

6
@JonSkeet ile anlaşın, bununla daha iyi sonuç alın: Nesne i = 10; Uzun l = ((Sayı) i) .longValue ();
depsypher

1
Bu yöntem iyi çalışıyor ancak nispeten yavaş ve bunu yapmanın diğer yöntemlerinden daha fazla bellek kullanıyor ...
krispy

1
ön uç geliştirici açısından harika görünüyor
Ezeewei

8

Tamsayıyı Uzun Çok Basit'e dönüştürme ve bu
Örnek 1'i dönüştürmenin birçok yolu

 new Long(your_integer);

Örnek 2

Long.valueOf(your_integer); 

Örnek 3

Long a = 12345L;

Örnek 4
Eğer tamsayı olarak int yazdıysanız, bunu yapabilirsiniz:

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

7

Tamsayı'nın sonuna 'L' ekleyerek bir tamsayıyı doğrudan uzuna dönüştürün.

Long i = 1234L;

5
Eminim tüm soruyu okumadan cevaplamışsınızdır!
Diablo

3
@Diablo, Google'da "int to long" araması yapıldığında bu soru ilk sonuçtur, bu yanıt başkaları için yararlı olabilir
Dimitri W

1
@DimitriW Bu cevabın yanlış olduğunu söylemiyorum ama bu sorunun cevabının yanlış olduğunu söylüyorum. Haklısın, Bu, soruyu okumayan ve sadece cevaba bakan insanlar için yararlıdır.
Diablo

7

Tamsayı boş değilse

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

iotomatik olarak bir long.

valueOfBunun yerine kullanılması new, bu değerin (küçükse) derleyici veya JVM tarafından önbelleğe alınmasına izin vererek daha hızlı kod sağlar.


Long.valueOf (Tamsayı i) yöntemini bulamıyorum, bulduğum tek yöntemler valueOf (long l), valueOf (String s) ve valueOf (String s, int radix). Java8 ve Java9 belgeleri için kontrol edildi.
Andy

1
Tamsayı örtük olarak ilkel bir uzun türe dönüştürülür.
lostintranslation


2

Tamsayının NULL olmadığını biliyorsanız, bunu basitçe yapabilirsiniz:

Integer intVal = 1;
Long longVal = (long) (int) intVal


1

intDeğişkenlerden longtüre bir ayrıştırıcı , Integersınıfa dahil edilir . İşte bir örnek:

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

Kolayca bir yöntem yaratmak için bu dahili işlevini kullanabilirsiniz bundan ayrıştırır intiçin 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

Bu boş güvenlidir

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

0

Eğer numarası (tam sınıfını bilmiyorsanız Tamsayı , Uzun , Çift , her neyse), sen yayın yapabilirsiniz Sayısı ve ondan uzun bir değer elde:

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

-1

Uzun türünde bir Liste olması durumunda, her bir Tamsayı değerinin sonuna L Ekleme

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

-1

Jackson tarafından değeri dönüştürmeyi deneyin

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

Olumsuz oy verildi çünkü bu kesinlikle en iyi cevap değil: bu çözüm gereksiz karmaşıklık, performans yükü ekliyor ve fazladan bir kitaplık gerektiriyor (Jackson)
NickGreen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.