Java中将int转换为Object

6
我有一个问题:我在Eclipse环境下工作。
有时候电脑不能进行以下转换:
int a ... 
Object ans = (int) a;

但仅限于这种转换:
int a ...
Object ans = (Integer) a;

我理解为什么可以在Object和Integer之间进行转换,但是为什么有时候可以将基本变量进行强制类型转换,而有时候又不能呢?
谢谢。
我附上了一段代码,编译器不允许我将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个回答

15

在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
自动装箱是在1.5版本中引入的。 - Boris the Spider
但有趣的是,我的朋友有相同的工作区(不同版本),而在我的朋友的计算机上 - 编译器没有抱怨(完全相同的代码,我在这里发送)。 - ZoharYosef
@ZoharYosef 你的朋友用什么JDK?是哪个版本? - Isaac
@Isaac,我的JDK版本是1.8.0。我得问一下我的朋友他用的是什么版本。顺便说一句,非常感谢你,你的解释清晰易懂。 - ZoharYosef
@ZoharYosef 还有一件要注意的事情是 Eclipse 的设置。很可能你的工作区配置为在这种情况下报错,而你朋友的工作区配置为忽略错误。请查看 工作区 -> 首选项 -> Java -> 编译器 -> 错误/警告。享受特拉维夫的鹰鬣蜥豆泥。沙洛姆。 - Isaac

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();  

如果它不是Integer类,这可能会引发ClassCastException异常。


0

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

    int i=5;

    Object test = (int)i;

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

输出:class java.lang.Integer

有人能帮我理解Java如何在内部处理这种转换吗?先谢谢了。 - raja
抱歉,我在这里是新手。是的,我已经提了一个单独的问题。 - raja

0
一个 Integer 也是一个 Object 并且作为一个对象存在于堆中。
一个 int 是一种 原始类型。它不是一个 Object。一个对象有自己的状态和行为属性,int没有这些。因此,在尝试将对象转换为原始类型时会出现编译错误。另一方面,由于 Autoboxing 的存在,将 int 转换为 Object 是可能的。

2
当您尝试将原始类型转换为对象或反之时,会出现编译错误。我认为这并不完全正确。编译器将为您自动执行装箱转换。问题在于对'int'的强制转换。 - Boris the Spider
@BoristheSpider - 我错了.. 修改了答案。谢谢.. :) - TheLostMind
所有基本类型都会自动转换为它们的包装类(或从包装类解封装)。int <-> Integer 不是特例。 - Boris the Spider
@BoristheSpider - 是的。但是你不能将对象强制转换为基本类型。直接将基本类型转换为对象(不是它们的包装类,int<->Object)也不好。 - TheLostMind

0

你应该了解 int(原始类型)和 Java 中的包装类 Integer 的区别。


-1
  • 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 - Boris the Spider
整数类在-127到128之间使用整数对象的外观。我认为提及这一点会不必要地增加复杂性。感谢您的反馈。 - Tanmay Patil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接