【问题标题】:Cast object (type double) to int将对象(双精度类型)转换为 int
【发布时间】:2015-02-12 02:48:06
【问题描述】:

好的,如果我有这个代码

double a=1.5;
int b=(int)a;
System.out.println(b);

一切正常,但是

Object a=1.5;
int b=(int)a;
System.out.println(b);

运行后报如下错误(Eclipse没有报错)

java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Integer

但是,当我这样做时

Object a=1.5;
double b=(double)a;
int c=(int)b;
System.out.println(c);

Object a=1.5;
int b=(int)(double)a;
System.out.println(b);

什么都没有了。

为什么必须先将其转换为double

【问题讨论】:

  • 我很困惑为什么你的Object a=1.5; double b=(double)a; 工作它会为 java.lang.Double 类而不是原始 double 工作。在我的日食中,您的工作部分不起作用,但这有效:double b=(Double)a;
  • 好吧,开始你自己的话题吧 ;)

标签: java casting int double


【解决方案1】:

当您声明对象Object a = 1.5 时,您可以通过检查System.out.println(a.getClass()) 来判断该对象实际上已转换为Double 实例。由于拆箱约定,这可以再次转换为double。之后,double 值可以转换为 int

但是,没有将 Double 实例转换为 int 的拆箱约定,因此如果您尝试这样做,运行时将发出 ClassCastException。它不能直接从DoubleInteger

【讨论】:

    【解决方案2】:

    当你从Object 投射时,你是来自包装器类型的unboxing...基本上你只能取消装箱到原始类型。它实际上是对相关包装器类型的强制转换,然后调用适当的xxxValue 方法。所以这个:

    Object x = ...;
    double d = (double) x;
    

    相当于:

    Object x = ...;
    double d = ((Double) x).doubleValue();
    

    如果x 不是对Double 的引用,那么转换为Double 显然会失败。

    所以你有问题的代码相当于:

    Object a = Double.valueOf(1.5); // Auto-boxing in the original code
    int b = ((Integer) a).intValue(); // Unboxing in the original code
    System.out.println(b);
    

    希望现在很明显为什么会失败 - 因为第一行创建了一个 Double,然后您尝试将其转换为 Integer

    【讨论】:

      【解决方案3】:

      我不确定为什么您的代码完全有效。您不应该将 Object 转换为“double”,因为它们是不兼容的类型。将类型 int 转换为 double 也是不兼容的类型。你的第一个代码块:

      double a=1.5;
      int b=(int)a;
      System.out.println(b);
      

      将打印“1”。您将丢失小数点。如果您只想打印小数点之前的数字,那么您可以在打印时格式化您的双精度数,而无需强制转换为 int 类型。

      但另一个不起作用的原因是因为您试图转换为不兼容的类型。奇怪的是你说最后两段代码

      Object a=1.5;
      double b=(double)a;
      int c=(int)b;
      System.out.println(c);
      
      
      Object a=1.5;
      int b=(int)(double)a;
      System.out.println(b);
      

      由于类型不兼容,这些不应该工作。

      【讨论】:

      • 它们不应该工作,我知道我应该使用Double.parseDouble(a.toString()),但出于某种原因,这工作。
      • 我不确定如何让它运行,除了你的第一个代码块之外的所有代码都会在编译时抛出 java 不兼容类型错误。所以你甚至可以运行这些似乎真的很奇怪。
      • 我使用的是 Java 8,完全没有任何错误
      • 你如何编译你的代码 - 我假设你使用的是 IDE 而不是命令行?我刚刚在 Intelij 中测试了 Java 7 和 8 中的每个块,它不会让我编译除第一个块之外的其他块。例如。 public class Casting { public static void main(String args[]) { Object a=1.5; int b=(int)(double)a; System.out.println(b); } }您是否已将 IDE 设置为忽略警告?
      • 我正在使用 Eclipse,完整代码在这里:pastebin.com/bRUVnuLA。通过终端编译得到以下输出:pastebin.com/aV8B5S3w
      猜你喜欢
      • 1970-01-01
      • 2015-06-12
      • 2015-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 2012-06-11
      • 1970-01-01
      相关资源
      最近更新 更多