它很简单,但我对下面的代码感到困惑,我能够存储和检索字符和字符串数组中的值,但不能从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
答案 0 :(得分:2)
java中基本类型的类型int
,其父类(称为原始包装类)为Integer
。虽然这两者基本上代表相同的数据,但它们不能直接从分配中直接翻译。 E.g。
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和拆箱的概念。前一代码将自动解释为编译器级别的后一代码,解决了将原始包装类型与原始类型等同的任何问题。
此概念也适用于使用{} 但初始化的数组,而不是现有数组,例如:
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或更低的源值),您的角色示例也应该失败(给定Character
是char
的原始包装类型,您正在初始化的基本类型)。我的猜测是你使用的是非标准的,不符合标准的编译器,它只支持语言功能或的子集,你试图在不同的源值下编译程序的不同部分。
答案 1 :(得分:0)
Integer
和int
是Java中的两种不同数据类型。 Integer
是一个提供Integer对象和静态方法的包装类,int
是一种原始数据类型。
您的代码将编译,但如果您认为最好使用此代码:
int[] intArray = {1,2,3,4,5};