杰瑞科技汇

java object 转long

  1. 判断类型:首先判断 Object 的实际运行时类型。
  2. 进行转换:根据其类型,选择合适的转换方法。

下面我将详细介绍几种常见的情况和对应的最佳实践。

java object 转long-图1
(图片来源网络,侵删)

核心方法:instanceof 和类型转换

这是最基础、最核心的方法。instanceof 运算符用于检查一个对象是否是某个特定类或其子类的实例。

Object obj = ...; // 你的对象
if (obj instanceof Long) {
    // obj 是 Long 类型,可以直接转换
    long value = (Long) obj;
    System.out.println("转换成功: " + value);
} else {
    // 否则,处理其他情况或抛出异常
    System.out.println("对象不是 Long 类型,无法直接转换。");
}

对象是 Long 类型(及其包装类)

这是最简单直接的情况。Longlong 的包装类,它们之间可以直接转换。

Object obj = 123L; // 或者 new Long(123L);
if (obj instanceof Long) {
    long primitiveLong = (Long) obj; // 从 Long 对象中拆箱出 long 基本类型
    System.out.println(primitiveLong); // 输出: 123
}

注意Longlong 之间的转换称为拆箱装箱,Java 编译器会自动处理。


对象是 Number 的子类(如 Integer, Double, Float, BigDecimal等)

很多数字类都继承自 java.lang.Number 类。Number 类提供了一些有用的方法,如 longValue(),可以将数字转换为 long 类型。

java object 转long-图2
(图片来源网络,侵删)

这是一个非常通用和推荐的方法,可以处理多种数字类型。

// 示例1: 从 Integer 转换
Object intObj = 987;
long fromInt = ((Number) intObj).longValue(); // 先强制转为 Number,再调用 longValue()
System.out.println(fromInt); // 输出: 987
// 示例2: 从 Double 转换
Object doubleObj = 123.45;
long fromDouble = ((Number) doubleObj).longValue(); // 会进行截断,小数部分丢失
System.out.println(fromDouble); // 输出: 123
// 示例3: 从 BigDecimal 转换
import java.math.BigDecimal;
Object bigDecimalObj = new BigDecimal("99999999999999999999");
long fromBigDecimal = ((Number) bigDecimalObj).longValue();
System.out.println(fromBigDecimal); // 输出: 9223372036854775807 (Long.MAX_VALUE)

优点

  • 代码简洁,可以处理所有 Number 的子类。
  • 自动处理了类型转换,无需为每种数字类型写 if-else

缺点

  • 如果对象不是 Number 或其子类(String, Date),强制转换为 Number 仍会抛出 ClassCastException

对象是 String 类型

Object 实际上是一个 String,你需要先将其解析为数字,这时应该使用 Long.parseLong() 方法。

java object 转long-图3
(图片来源网络,侵删)
Object strObj = "9876543210";
if (strObj instanceof String) {
    try {
        long value = Long.parseLong((String) strObj);
        System.out.println("转换成功: " + value);
    } catch (NumberFormatException e) {
        System.out.println("字符串无法解析为 long 类型: " + strObj);
    }
}

最佳实践(结合 Number 类): 你可以写一个更通用的方法,它首先尝试将对象视为 Number,如果失败,再尝试将其视为 String

public static long convertToLong(Object obj) {
    if (obj == null) {
        return 0L; // 或者 throw new IllegalArgumentException("Object cannot be null");
    }
    // 如果是 Number 或其子类
    if (obj instanceof Number) {
        return ((Number) obj).longValue();
    }
    // 如果是 String
    if (obj instanceof String) {
        try {
            return Long.parseLong((String) obj);
        } catch (NumberFormatException e) {
            // 可以选择返回默认值或抛出更具体的异常
            throw new IllegalArgumentException("String cannot be parsed to a long: " + obj, e);
        }
    }
    // 其他类型无法转换
    throw new IllegalArgumentException("Object of type " + obj.getClass().getName() + " cannot be converted to long.");
}
// 使用示例
public static void main(String[] args) {
    System.out.println(convertToLong(100L));           // 100
    System.out.println(convertToLong(99.9));           // 99
    System.out.println(convertToLong("12345"));        // 12345
    System.out.println(convertToLong(new BigDecimal("500"))); // 500
    // System.out.println(convertToLong("hello")); // 抛出 IllegalArgumentException
    // System.out.println(convertToLong(new Date())); // 抛出 IllegalArgumentException
}

对象是 null

处理 null 是一个必须考虑的边界情况,直接对 null 进行转换会抛出 NullPointerException

Object nullObj = null;
// 错误示范
try {
    // long value = (Long) nullObj; // 抛出 NullPointerException
} catch (NullPointerException e) {
    System.out.println("捕获到空指针异常");
}
// 正确的做法是在转换前检查是否为 null
if (nullObj != null) {
    // ... 进行转换
} else {
    // 决定如何处理 null 值,例如返回默认值 0
    System.out.println("对象为 null,返回默认值 0");
}

总结与最佳实践

源对象类型 推荐转换方法 注意事项
Long (Long) obj 直接拆箱。
Integer, Double, Float, BigDecimal ((Number) obj).longValue() 通用推荐,处理所有 Number 子类,会进行截断(如 double)。
String Long.parseLong((String) obj) 必须处理 NumberFormatException
null 先检查 if (obj != null) 避免空指针异常。
其他类型 无法直接转换,需特殊处理或抛出异常 Date, Boolean 等,需要明确的业务规则来转换。

最终建议:

创建一个通用的工具方法,如上面示例中的 convertToLong(Object obj),这是最健壮和可维护的做法,它能处理 NumberString 两种最常见的情况,并妥善处理 null 和无效输入。

import java.math.BigDecimal;
public final class LongConverter {
    private LongConverter() {} // 工具类,防止实例化
    /**
     * 将任意对象尝试转换为 long 类型。
     * 支持类型: Long, Number (Integer, Double, etc.), String。
     * @param obj 要转换的对象
     * @return 转换后的 long 值
     * @throws IllegalArgumentException 如果对象为 null 或无法转换
     */
    public static long toLong(Object obj) {
        if (obj == null) {
            throw new IllegalArgumentException("Input object cannot be null");
        }
        if (obj instanceof Number) {
            return ((Number) obj).longValue();
        }
        if (obj instanceof String) {
            try {
                return Long.parseLong((String) obj);
            } catch (NumberFormatException e) {
                throw new IllegalArgumentException("The provided string '" + obj + "' is not a valid long number.", e);
            }
        }
        throw new IllegalArgumentException("Cannot convert object of type " + obj.getClass().getName() + " to long.");
    }
    public static void main(String[] args) {
        System.out.println(toLong(123L));         // 123
        System.out.println(toLong(456.78));      // 456
        System.out.println(toLong("9999999999")); // 9999999999
        // 以下会抛出 IllegalArgumentException
        // System.out.println(toLong(null));
        // System.out.println(toLong("abc"));
        // System.out.println(toLong(true));
    }
}
分享:
扫描分享到社交APP
上一篇
下一篇