2015-05-07 133 views
-2

它很简单,但我对以下代码感到困惑,我能够存储和检索来自Character和string数组的值,但不能从Integer中存储值。在整数数组中存储值

Integer[] intArray = {1,2,3,4,5}; //Type mismatch: cannot convert from int to Integer 
String[] str1 = {"pk1", "pk2", "pk3", "pk4", "pk5"}; //works fine 
Character[] charArray = { 'H', 'E', 'L', 'L', 'O' }; //Works fine 
+2

所有这三行对我来说都很好。你真的使用java吗?哪个编译器? –

+0

可能的重复http://stackoverflow.com/questions/24591491/autoboxing-cant-convert-an-int-to-an-integer –

+0

是的我只使用java编译器。 – user4143078

回答

0

Integerint在Java两种不同的数据类型。 Integer是一个提供Integer对象和静态方法的包装类,int是一种原始数据类型。

您的代码可以编译,但如果想在你的情况下,它会更好地利用这一点:

int[] intArray = {1,2,3,4,5}; 
+0

我同意这两种是JAVA中的不同数据类型,如果我想仅以整数类型存储值,该怎么办?我正在尝试泛型,其中泛型类型可以打印所有不同类型的对象值,能够获得字符串和字符的结果,但在整数转换时出现错误。 – user4143078

+0

对于字符串,它是关于默认分配的。 “pk1”默认被自动装入到“String”对象中。然而,我很困惑'H'如何被自动装入到一个Character对象中,并且不会被自动装箱到一个Integer中。 – damith219

+2

@ damith219 *“”pk1“默认为自动装入”String“对象”*什么? *“pk1”*是一个字符串字面值,不需要在那里自动装箱。 – Tom

2

在Java中的原始类型的类型int它的父类(也称为原始的包装类)是Integer。虽然两者基本上代表相同的数据,但它们不能直接从作业中直接翻译。例如。

int foo = 56; 
Integer bar = foo; 

将抛出编译错误(当且仅当你的源代码编译级别已设置为< = 1.4,但得到的这个版本)。

正确的方法将它们之间的转换将是:

int foo = 56; 
Integer bar = new Integer(foo); 

虽然这似乎过于复杂/冗长。因此,自JDK 1.5/5.0(11年前发布!)以来Oracle/Sun Microsystems公司的优秀员工介绍了autoboxing的概念并将其拆箱。前者的代码将自动被解释为编译器级别的后者代码,从而解决将原始包装器类型与原始类型等同的问题。

这个概念也适用于使用{} 初始化没有到现有阵列阵列,e.g:

int[] foo = new int[50]; 
Integer[] bar = foo; 

总是会给一个编译器错误,无论你是编译的版本。由于自动装箱只能在primitive -> primitive wrapper type而不是primitive[] -> primitive wrapper type[]上运行。

就您而言,您的源合规性级别(通常由-source xx设置)已设置为1.4或更低(或者您使用2002年的编译器,谁知道)。要解决,请将源合规性提高到等于或高于1.5,以启用自动装箱功能。

注:在自动装箱的禁止(通过1.4或更低的源值),你的性格,例如应该失败过(因为Characterchar原始封装类型,你是从初始化基本类型)。我的猜测是你正在使用一个非标准,不合规的编译器,它只支持语言特征的子集,你试图用不同的源值来编译你的程序的不同部分。

+0

很好的解释谢谢。我的合规性级别设置为1.6,并使用相同版本的JRE。不知道什么是问题,你能不能告诉我如何设置,这样我的eclipse支持转换类型编程很容易。基本上不能工作任何收集程序(总是收到异常)。 – user4143078

+0

尝试添加ArrayList中的值以获取错误消息。 “类型ArrayList 中的方法add(int,Integer)不适用于参数(int)”。 – user4143078

+0

@ user4143078也许尝试重新安装Eclipse/JDK并安装最新版本的JDK(截至编写时,8u45)。看起来像你的编译器或Eclipse中的一个小故障/错误。我还建议清理/重建您的工作区以摆脱它可能已经生成的任何旧的/无效的类文件。 – initramfs