我有一个问题:我在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);
}
答案 0 :(得分:13)
在Java 1.5之前,你甚至不能这样做:
int a;
...
Object x = (Integer) a;
编译器会抱怨a
是原始数据类型,因此无法强制转换为对象。
从Java 1.5开始,Java引入了自动装箱的概念。所以,以下变得可以:
int a;
...
Object x = (Integer) a;
因为编译器知道如何自动地从原始int
转换为盒装类型Integer
;它从Integer
到Object
,好吧,不是问题。
然而,您正在尝试做的事情:
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
答案 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
引用。
希望这有帮助。
祝你好运。