在java上将int转换为Object

时间:2014-06-09 06:47:56

标签: java casting

我有一个问题:我在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);
    }

6 个答案:

答案 0 :(得分:13)

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

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

编译器会抱怨a是原始数据类型,因此无法强制转换为对象。

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

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

因为编译器知道如何自动地从原始int转换为盒装类型Integer;它从IntegerObject,好吧,不是问题。

然而,您正在尝试做的事情:

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

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

答案 1 :(得分:3)

您无法从引用的数据类型转换为基本数据类型,即您不能:

 Object x = (int)a;  

但你可以这样做:

 Object x = (Integer)a;  

因为Integer是一个类而int是原始数据类型 如果我认为它正确,你想要实现的功能是从对象x获取整数值,可以这样做:

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

如果不是ClassCastException类,可以通过Integer

答案 2 :(得分:0)

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

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

,可以将int转换为Object

答案 3 :(得分:0)

您应该研究 int 这是一种原始类型与 Integer 之间的区别,它是Java中的包装类。

答案 4 :(得分:0)

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

    int i=5;

    Object test = (int)i;

    System.out.println(test.getClass());

输出:class java.lang.Integer

答案 5 :(得分:-1)

  • int是原始类型。

    声明方式:int a = 5;

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

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


写作时

Integer a = 5;

编译器自动将其转换为

Integer a = new Integer(5);

此功能称为Autoboxing (自Java 5.0起)


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

写作时

Object ans = (Integer) a;

编译器进行自动装箱然后再进行投射。

Object ans = (int) a;

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

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