2015-05-07 181 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