【问题标题】:Casting int to Object on java在java上将int转换为Object
【发布时间】:2014-06-09 06:47:56
【问题描述】:

我有一个问题:我在 Eclipse 环境中工作。

有时计算机不会进行以下投射:

int a ... 
Object ans = (int) a;

但只有这种转换:

int a ...
Object ans = (Integer) a;

我明白为什么你可以在ObjectInteger 之间进行转换,但为什么要使用原始变量 - 有时可以,有时不能进行转换?

谢谢

我正在附加编译器不允许我在 int 变量到对象之间进行转换的代码:

/** @return minimum element */
    public Object minimum(){
        return minimum(this.root);
    }
    public Object minimum(BSTNode node){
        if (node.left != null) return minimum(node.left);
        return node.data;
    }
        /** @return maximum element */  
    public Object maximum(){
        return maximum(this.root);
    }
    public Object maximum(BSTNode node){
        if (node.right != null) return maximum(node.right);
        return node.data;
    }

    public Object findNearestSmall(Object elem) {
        int diff;
        diff = (int)maximum() - (int)minimum();
        if (compare(minimum(), elem) == 0) return elem;
        else return findNearestSmall(elem, this.root, diff);
    }   
    public Object findNearestSmall(Object elem, BSTNode node, int mindiff){
           if(node == null) return (int)elem - mindiff;

           int diff = (int)elem - (int)node.data;

           if(diff > 0 && mindiff > diff) mindiff = diff;
           /* Case 2 : Look for in left subtree */
           if(compare(node.data, elem)>-1)
                   return findNearestSmall(elem, node.left, mindiff);
           else
           /* Case 3 : Look for in right subtree */ 
                   return findNearestSmall(elem, node.right, mindiff);
    }

【问题讨论】:

    标签: java casting


    【解决方案1】:

    在 Java 1.5 之前,你甚至不能这样做:

    int a;
    ...
    Object x = (Integer) a;
    

    编译器会抱怨a 是原始数据类型,因此不能转换为对象。

    从 Java 1.5 开始,Java 引入了自动装箱的概念。所以,以下就OK了:

    int a;
    ...
    Object x = (Integer) a;
    

    因为编译器知道如何自动从原始int 转换为装箱类型Integer;从IntegerObject,这都不是问题。

    但是,你想要做什么:

    int a;
    ...
    Object x = (int) a;
    

    基本上是告诉编译器避免装箱。您明确告诉编译器将a 保留为int,并将对该int 的引用放入Object。编译器不是为处理这种情况而设计的。

    【讨论】:

    • 自动装箱是在 1.5 中引入的
    • 但有趣的是我朋友有相同的工作区(不是相同的版本),而且在我朋友的电脑上——编译器没有报错(和我在这里发送的代码完全一样)跨度>
    • @ZoharYosef 你的朋友使用什么 JDK?什么级别?
    • @Isaac 我的 JDK 是 1.8.0。我得问问我朋友他有什么。 p.s.非常感谢,你有一个清晰而很好的解释
    • @ZoharYosef 另一个需要注意的是 Eclipse 设置。在这种情况下,您的工作区很可能被配置为给出错误,而在您朋友的工作区中,它被配置为原谅。查看工作区 -> 首选项 -> Java -> 编译器 -> 错误/警告。在特拉维夫享用鹰嘴豆泥。沙洛姆
    【解决方案2】:

    您不能从引用的数据类型转换为原始数据类型,即您不能:

     Object x = (int)a;  
    

    你可以这样做:

     Object x = (Integer)a;  
    

    因为Integer 是一个类,而int 是一个原始数据类型。
    如果我假设正确,您想要实现的功能是从 Object x 获取整数值,可以这样做:

     Object x = (Integer)a;  
     //Do something and somewhere else  
     int z = ((Integer)x).intValue();  
    

    如果它不属于Integer 类,则可以通过ClassCastException

    【讨论】:

      【解决方案3】:

      你应该看看 int 是原始类型和 Integer 之间的区别,Integer 是 Java 中的包装类。

      【讨论】:

        【解决方案4】:

        Integer 也是 Object 并作为对象保留在堆上。

        int 是一个原始类型。它不是Object。一个对象有它自己的状态和行为属性,int 没有这些。因此,在尝试将 Object 转换为原语时会出现编译错误。另一方面,将 int 转换为 Object 是可能的,因为 Autoboxing

        【讨论】:

        • 因此,当您尝试将原语转换为 Object 或反之时,您会遇到编译错误 我不会说这是真的。编译器将为您自动装箱转换。问题在于 int 的演员表。
        • @BoristheSpider - 我的错.. 改变了答案。谢谢.. :)
        • 所有原语都自动(取消)装箱到/从它们的包装类。 int <-> Integer 不是特例。
        • @BoristheSpider - 是的。但是您不能将对象转换为基元。并且直接将原语转换为 Object(不是它们的包装器,intObject)也不好。
        【解决方案5】:

        但我能够执行以下代码。我正在使用 jdk 1.6,以下代码不会向我抛出任何错误或运行时异常。

            int i=5;
        
            Object test = (int)i;
        
            System.out.println(test.getClass());
        

        输出:类 java.lang.Integer

        【讨论】:

        • 有人能帮我理解 java 如何在内部处理这种转换。提前致谢。
        • 对不起,我是新来的。是的,我提出了一个单独的问题。
        【解决方案6】:
        • int 是原始类型。

          声明方式:int a = 5;

        • Integer 是一个包装类(它扩展了 Object)。

          声明方式:Integer a = new Integer(5);


        当你写作时

        Integer a = 5;
        

        编译器会自动将其转换为

        Integer a = new Integer(5);
        

        此功能称为自动装箱 (从 Java 5.0 开始)


        • int 不能转换为 Object,因为它根本不是引用的数据类型(对象)。
        • 但它可以转换为其他原始类型。
        • 另一方面,Integer 可以转换为 Object

        当你写作时

        Object ans = (Integer) a;
        

        编译器进行自动装箱,然后强制转换。

        Object ans = (int) a;
        

        导致编译器错误,因为转换为 int 成功,但无法将其分配给 Object 引用。

        希望这会有所帮助。
        祝你好运。

        【讨论】:

        • 这是对问题的错误过度简化。 new Integer 没有被调用,你永远不应该用new Integer 声明Integer
        • Integer 类确实在 -127 到 128 的场景后面使用了 Integer 对象的外观。我认为提及这一点会不必要地增加复杂性。不过感谢您的反馈。
        猜你喜欢
        • 2020-07-03
        • 1970-01-01
        • 2022-12-19
        • 2012-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-01
        • 1970-01-01
        相关资源
        最近更新 更多