将整数转换为Long


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);

问题是我似乎无法转换IntegerLong

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

有没有更好的方法来实现这一目标?

我正在使用Java 1.6。

Answers:


91

不,即使可以从转换IntegerLong,也无法转换intlong。对于已知为数字的单个值,并且想要获取长整型值,可以使用:

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

对于数组,这将比较棘手...


对于数组,我可以Number[]在其上使用和循环来创建适当类型的数组,对吗?
Tiago Veloso

@Tiago:这取决于该方法实际返回的内容。这将不是一个工作double[]的例子,但工作了Double[]
乔恩·斯基特

7
为什么不能将整数从整数转换为整数?
2013年

@MrMas:因为它们是单独的引用类型,所以它们都是的直接子类Number。或者换一种说法:你认为哪个转换规则不会让你从一个转换到其他?
乔恩·斯基特

6
好。问题是继承。我在考虑精度。整数可以转换为长整数而不会丢失信息。但是继承结构没有任何信息可以告诉编译器。
2013年


53
Integer i = 5; //example

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

这样可以避免转换为字符串带来的性能损失。longValue()Integer中的方法只是int值的强制转换。该Long.valueOf()方法使虚拟机有机会使用缓存的值。


2
保存为空:Long l = i == null?null:i.longValue()
Adrodoc55 '16

19

奇怪的是,我发现如果您从字符串中进行解析,则可以正常工作。

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

赢得。


1
这对我来说绝对没有意义,但它就像一种魅力。非常感谢!
Bouncner 2013年

33
无缘无故地引入字符串转换是一个非常糟糕的主意……这样做根本没有任何好处。
乔恩·斯基特

6
同意@JonSkeet,更好一点:Object i = 10; Long l =(((Number)i).longValue();
depsypher

1
此方法可以正常工作,但相对于其他方法而言相对较慢并且使用更多的内存...
krispy14年

1
从前端开发人员的角度来看

8

将整数转换为Long非常简单,并且有许多方法可以转换该
示例1

 new Long(your_integer);

例子2

Long.valueOf(your_integer); 

例子3

Long a = 12345L;

示例4
如果已经将int输入为Integer,则可以执行以下操作:

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

7

通过将'L'添加到Integer的末尾,将整数直接转换为long。

Long i = 1234L;

5
我确定您已经回答了所有问题,而没有阅读整个问题!
暗黑破坏神

3
@Diablo这个问题是在Google上搜索“ int to long”时的第一个结果,此答案可能对其他人有用
Dimitri W

1
@DimitriW我并不是说这个答案是错误的,而是我说这个问题的答案是错误的。您是对的,这对那些不阅读问题并且只看答案的人很有用。
暗黑破坏神

7

如果Integer不为null

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

i将自动类型转换为long

使用valueOf代替new允许编译器或JVM缓存此值(如果很小),从而加快代码速度。


我找不到Long.valueOf(Integer i)方法,我发现的唯一方法是valueOf(long l),valueOf(String s)和valueOf(String s,int radix)。检查了Java8和Java9文档。
安迪

1
整数隐式转换为原始long类型。
lostintranslation




1

类中包含一个从int变量到long类型的解析器Integer。这是一个例子:

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

您可以轻松地使用内置函数来创建一个方法,从解析intlong

    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

如果您不知道数字的确切类别(IntegerLongDouble等等),则可以将其转换为Number并从中获取long值:

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


-1

尝试转换Jackson的Value

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

投反对票,因为这绝对不是最佳答案:此解决方案增加了不必要的复杂性,性能开销,并需要一个额外的库(Jackson)
NickGreen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.