- 判断类型:首先判断
Object的实际运行时类型。 - 进行转换:根据其类型,选择合适的转换方法。
下面我将详细介绍几种常见的情况和对应的最佳实践。

核心方法:instanceof 和类型转换
这是最基础、最核心的方法。instanceof 运算符用于检查一个对象是否是某个特定类或其子类的实例。
Object obj = ...; // 你的对象
if (obj instanceof Long) {
// obj 是 Long 类型,可以直接转换
long value = (Long) obj;
System.out.println("转换成功: " + value);
} else {
// 否则,处理其他情况或抛出异常
System.out.println("对象不是 Long 类型,无法直接转换。");
}
对象是 Long 类型(及其包装类)
这是最简单直接的情况。Long 是 long 的包装类,它们之间可以直接转换。
Object obj = 123L; // 或者 new Long(123L);
if (obj instanceof Long) {
long primitiveLong = (Long) obj; // 从 Long 对象中拆箱出 long 基本类型
System.out.println(primitiveLong); // 输出: 123
}
注意:Long 和 long 之间的转换称为拆箱和装箱,Java 编译器会自动处理。
对象是 Number 的子类(如 Integer, Double, Float, BigDecimal等)
很多数字类都继承自 java.lang.Number 类。Number 类提供了一些有用的方法,如 longValue(),可以将数字转换为 long 类型。

这是一个非常通用和推荐的方法,可以处理多种数字类型。
// 示例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() 方法。

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),这是最健壮和可维护的做法,它能处理 Number 和 String 两种最常见的情况,并妥善处理 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));
}
} 