将整数转换为长数

我需要使用反射获取字段的值。碰巧我并不总是确定字段的数据类型是什么。为此,为了避免一些代码重复,我创建了以下方法:

@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

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

我正在使用 Java 1.6。

463109 次浏览

不,你不能把 Integer转换成 Long,即使你可以从 int转换成 long。对于一个已知为数字的 个人值,如果你想得到较长的值,你可以使用:

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

对于数组来说,这将更加棘手... ..。

奇怪的是,我发现如果从字符串解析,它会工作。

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

赢。

Integer i = 5; //example


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

这样可以避免转换为 String 所带来的性能损失。Integer 中的 longValue()方法只是 int 值的强制转换。Long.valueOf()方法为 vm 提供了使用缓存值的机会。

简单来说:

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

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

Long i = 1234L;

转换整数到长非常简单和许多方法转换
例子一

 new Long(your_integer);

例子2

Long.valueOf(your_integer);

例子3

Long a = 12345L;

例子4
如果已经输入了 int 类型的 Integer,那么可以这样做:

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

如果您知道 Integer 不是 NULL,您可以简单地这样做:

Integer intVal = 1;
Long longVal = (long) (int) intVal
new Long(Integer.longValue());

或者

new Long(Integer.toString());
((Number) intOrLongOrSomewhat).longValue()

Integer类中包含从 int变量到 long类型的解析器:

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

如果整数不为空

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

i将自动转换为 long

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

对于 Long 类型的 List,将 L 添加到每个 Integer 值的末尾

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

这是完全安全的

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

尝试转换 Jackson 的 Value

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

如果你不知道你的数字的确切类别(整数很长双倍,无论什么) ,你可以强制转换到 号码并从中得到你的长值:

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

对于可为空的包装器实例,

Integer i;
Long l = Optional.ofNullable(i)
.map(Long::valueOf)
.orElse(null);

要将 Integer 转换为 Long,只需转换 Integer 值

Integer intValue = 23;
Long longValue = (long) intValue;