我有一个小的java文件,如下所示。
class abc{
public static void main(String args[]){
Object a= 9;
int b= (int)a;
System.out.print(b);
}
}
在cmd中编译时出错,但在Netbeans中没有。此外,当我更换'(int)a'使用'(整数)a',它可以在cmd和Netbeans上编译并运行良好。
class abc{
public static void main(String args[]){
Object a= 9;
int b= (Integer)a;
System.out.print(b);
}
}
这是什么原因以及如何解决这个问题?
编辑:编译第一个代码时出现的错误是:
C:\Users\ANKIT.ANKITSHUBHAM-PC>javac abc.java
abc.java:4: inconvertible types
found : java.lang.Object
required: int
int b= (int)a;
^
1 error
编辑:这个问题不是关于施法。这就是为什么当我使用'(int)'将对象转换为int时,cmd和Netbeans的行为会有所不同。但是在使用'(整数)'。
进行投射时表现相同答案 0 :(得分:9)
这里会发生什么:
Object a= 9;
是:
int
的9
Integer
中
Object
现在,在下一行,Object
无法转换为Java 6中的int
,因为它实际上是Integer
,而不是原始类型。然而,它可以转换为Integer
,然后自动拆箱负责从int
中提取Integer
。
现在到了#34;为什么它在Netbeans中工作呢?"
Netbeans使用与命令行 javac
不同的编译器(请参阅here)。它的行为可能与javac
不同,并且更宽容 - 当遇到尝试将其强制转换为Integer
时,它可能会自动取消装箱int
。
根据另一个答案,Java 7在这种情况下支持自动拆箱,因此可能的原因是您的命令行javac
来自Java 6,而您的Netbeans使用Java 7编译器(或更高版本)。
答案 1 :(得分:5)
我说它是由于不同的编译器版本(或源合规级别):
$ javac abc.java -source 1.6
warning: [options] bootstrap class path not set in conjunction with -source 1.6
abc.java:4: error: incompatible types: Object cannot be converted to int
int b= (int)a;
^
1 error
1 warning
$ javac abc.java -source 1.8
$ java abc
9
这似乎是在Java 7中所做的更改。请参阅this question及相关答案。
看看其他一些答案,我认为指出你的代码是完全有效的Java 7代码是很重要的。
您不需要NetBeans编译器,我只是说从Oracle网站安装Java 8并且您已经完成了。您只需要担心代码是否需要在Java 6上运行,在这种情况下,您的代码需要向后兼容。
答案 2 :(得分:2)
您无法将Object转换为基本类型的数据,也许NetBeans会为您执行一个框。您在两种环境中使用什么Java版本进行编译?
答案 3 :(得分:2)
这种漠不关心的行为的原因是Netbeans使用的是Java 7,但是cmd仍在使用Java 6.使用'(int)' Java 6中不允许使用Java 7。
如何从cmd使用Java 7? 答:
将有两个部分;我们对那些带有标题'系统变量'
选择'路径'然后单击“编辑”按钮。
单击“确定”。
现在尝试从cmd运行。希望它有效!
答案 4 :(得分:0)
那是因为你无法将Object
转换为基本类型的数据。在第二个代码示例中,您实际上是将Object
转换为Integer
,然后将其解包为原始int
。