【问题标题】:java.lang.Long cannot be cast to java.lang.Doublejava.lang.Long 不能转换为 java.lang.Double
【发布时间】:2015-09-24 09:12:29
【问题描述】:

我有一个将对象作为输入的方法,如果输入是 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);

这令人困惑。

【问题讨论】:

  • 您不能将 Object 转换为原始类型。就是这样。
  • ((Long) longValue).doubleValue()
  • @Kii,如果对象是包装类类型,您实际上可以,然后将进行拆箱...
  • 既然没有原始类型对象,我想我是对的。
  • 是的,你是对的,但如果我喜欢 Long longInstance = new Long(15); double valueOne = (double)longInstance;那么它不会给我任何异常,而如果我将 longInstance 包装到 Object 中并做同样的事情,那么它会给出 ClassCastException。

标签: java


【解决方案1】:

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

当将对象类型转换为原始类型时,它会缩小然后拆箱

    double d1=(double)o; 

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

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

    double d2 =(double)l; 

它会先调用longvalue()方法对Long值进行拆箱,然后将long扩大到double,这样不会出错。

【讨论】:

    【解决方案2】:

    如果您不确定对象是什么数字类型,那么我建议使用此代码 sn-p:

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

    【讨论】:

      【解决方案3】:

      先判断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;
           }
      

      【讨论】:

        【解决方案4】:

        您尝试将 Object 转换为 double,因为您的 convertDouble 参数属于 Type 对象。因此,自动拆箱将不起作用。会有两种解决方案: 首先,将对象转换为 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 转换为类型,你最终有

        【讨论】:

          【解决方案5】:

          这种方法的性能不是很好,但可以将任何数字对象转换为常见的 java.lang 对象(字节、短整型、整数、长整型、浮点型和双精度型)。

          这使用反射来调用 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;
          }
          

          【讨论】:

            猜你喜欢
            • 2021-07-09
            • 2020-10-10
            • 1970-01-01
            • 2016-07-26
            • 2013-08-24
            • 2015-05-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多