我有一个小java文件给出如下.
class abc{
public static void main(String args[]){
Object a= 9;
int b= (int)a;
System.out.print(b);
}
}
Run Code Online (Sandbox Code Playgroud)
它在cmd中编译时出错,但在Netbeans中没有.此外,当我用'(整数)a'替换'(int)a'时,它在cmd和Netbeans上编译并运行正常.
class abc{
public static void main(String args[]){
Object a= 9;
int b= (Integer)a;
System.out.print(b);
}
}
Run Code Online (Sandbox Code Playgroud)
这是什么原因,我该如何解决这个问题?
编辑:编译第一个代码时出现的错误是:
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
Run Code Online (Sandbox Code Playgroud)
编辑:这个问题不是关于铸造.这是为什么当我使用'(int)'将对象转换为int时cmd和Netbeans的行为不同,但在使用'(Integer)'进行转换时表现相同.
这里发生了什么:
Object a= 9;
Run Code Online (Sandbox Code Playgroud)
是:
int9已创建值Integer使用自动装箱中Object现在,在下一行,Object不能int 在Java 6中强制转换,因为它实际上是一个Integer,而不是原始类型.Integer然而,它可以转换为,然后自动拆箱负责int从中提取Integer.
现在到"为什么它在Netbeans中工作呢?"
Netbeans使用与命令行不同的编译器(参见此处)javac.它可能以不同的方式表现javac并且更宽容 - 也许它Integer在遇到尝试将其强制转换时自动取消装箱int.
根据另一个答案,Java 7在这种情况下支持自动拆箱,因此可能的原因是您的命令行javac来自Java 6,而您的Netbeans使用Java 7编译器(或更高版本).
我想这是由于不同的编译器版本(或源合规级别):
$ 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
Run Code Online (Sandbox Code Playgroud)
看起来这是在Java 7中所做的更改.请参阅此问题和相关答案.
看看其他一些答案,我认为指出你的代码是完全有效的Java 7代码是很重要的.
您不需要NetBeans编译器,我只是说从Oracle网站安装Java 8就可以了.您只需要担心代码是否需要在Java 6上运行,在这种情况下,您的代码需要向后兼容.
这种冷漠行为的原因是 Netbeans 使用的是 Java 7,但 cmd 仍在使用 Java 6。Java 6 中不允许使用“(int)”进行转换,但 Java 7 中允许。
如何从cmd使用Java 7?回答:
打开“我的电脑”
单击顶部的“系统属性”选项卡。
单击左侧窗格中的“高级系统设置”。
单击“环境变量...”按钮。
将分为两个部分;我们对标题为“系统变量”的内容感到困扰
选择“路径”并单击“编辑”按钮。
添加java 7的javac地址。在我的例子中,它是“C:\Program Files\Java\jdk1.7.0_79\bin”。它包含javac.exe
单击“确定”。
现在尝试从 cmd 运行。希望它有效!