繁体   English   中英

java.lang.Long 不能转换为 java.lang.Double

[英]java.lang.Long cannot be cast to java.lang.Double

我有一个将对象作为输入的方法,如果输入是 instanceOF Long,则将值转换为双精度值。 下面是代码:

public static void main(String[] args) {
    Long longInstance = new Long(15);
    Object value = longInstance;
    convertDouble(value);
}

static double convertDouble(Object longValue){
    double valueTwo = (double)longValue;
    System.out.println(valueTwo);
    return valueTwo;
}

但是当我执行上面的代码时,我遇到了以下异常:

Exception in thread "main" java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Double
at com.datatypes.LongTest.convertDouble(LongTest.java:12)
at com.datatypes.LongTest.main(LongTest.java:8)

请让我知道为什么它给我例外。

但是如果直接尝试将 Long 对象转换为 double 则不会出现 classCast 异常。

Long longInstance = new Long(15);
    double valueOne = (double)longInstance;
    System.out.println(valueOne);

这令人困惑。

在 JLS 中找到解释, https: //docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.5
表 5.1 下。 将转换转换为原始类型

    Long l = new Long(15);
    Object o = l;

将 Object Type 转换为原始类型时,它将缩小然后拆箱

    double d1=(double)o; 

在上面的语句中,我们试图将Object 缩小为 Double ,但由于实际值是 Long所以在运行时它会根据5.1.6 中定义的缩小转换规则抛出ClassCastException 缩小参考转换

将 Long Type 转换为 double 时,会先拆箱,然后加宽

    double d2 =(double)l; 

它将首先通过调用 longvalue() 方法对 Long 值进行拆箱,然后进行从 long 到 double 的扩展,这可以没有错误。

如果您不确定对象是什么数字类型,那么我建议使用以下代码片段:

double d = 0.0;
if (obj instanceof Number) {
    d = ((Number) obj).doubleValue();
}

首先检查Object是否为instanceof Long,然后调用Long对象的valueOf

片段:

static double convertDouble(Object longValue){
        double valueTwo = -1; // whatever to state invalid!

        if(longValue instanceof Long) 
           valueTwo = ((Long) longValue).doubleValue();

        System.out.println(valueTwo);
          return valueTwo;
     }

您尝试将 Object 转换为 double,因为您的 convertDouble 参数是 Type 对象。 因此,自动拆箱将不起作用。 将有两种解决方案:首先,将 Object 强制转换为 Long(使用 instanceof 检查)其次,使用 Long 作为参数

public static void main(String[] args) {
    Long longInstance = new Long(15);
    Object value = longInstance;
    convertDouble(value);
}

static double convertDouble(Long longValue){
    double valueTwo = (double)longValue;
    System.out.println(valueTwo);
    return valueTwo;
}

如果你想使用 convertDouble 方法转换不同类型的参数,你可以检查 instanceof 然后将 Object 转换为类型,你最终有

这种方法不是很高效,但可以将任何 Number 对象转换为常见的 java.lang 对象(Byte、Short、Integer、Long、Float 和 Double)。

这使用反射来调用 Number 类的方法(shotValue()、intValue() 等)。

不幸的是,不存在 integerValue 方法名称,因此我使用替换字符串将整数转换为 int。

我希望有帮助。

public <T extends Number> T cast(Number value, Class<T> toClass) {

    try {
        String methodName = toClass.getSimpleName().toLowerCase().replace("integer", "int") + "Value";
        Method m = Number.class.getMethod(methodName);
        return (T) m.invoke(value);
    } catch (Exception ex) {
    }
    return null;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM