2014-03-06 19 views
4

我有一個方法,它接受int []參數。我想通過它一系列的短褲。但我得到的是「不兼容的類型:short []不能轉換爲int []」。這是爲什麼? 一個例子:爲什麼我不能在java中傳入一個short的數組來接受int數組?

short[] arr = new short[2]; 
arr[0] = 8; 
arr[1]=9; 
example(arr); 

example(int[] anArray){ 
} 

據我所知,短int是剛剛拉大,所以應該自動類型強制轉換,不應該嗎? 如何通過它呢? 謝謝。

+0

你已經有了一些很好的特定的Java-解答您的問題。但是,由於'short''和'int'似乎是相關的,因此你認爲'short []'和'int []'會相互關聯,這是非常合理的。如果您想更多地瞭解這些問題,請從http://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)開始。 –

+1

從技術上講,Java可能可以做到這一點,因爲數組是(幾乎)完整的對象,因此讀/寫數組元素的操作知道(或可能)實際的數組元素類型。所以至少有一部分答案是C不能處理相同的情況,而Java是在C之後建模的。無論這種改變是好還是壞都難以判斷。 (但它在Java中永遠不會改變 - 也許是一些後續語言。) –

回答

4

你不能那樣做,因爲short[]不是int[]。此外,short不是int,它只是允許進行基本擴展轉換,以允許short擴展爲int。但是,對於基元類型的數組,沒有這種原始的拓寬轉換。

這迫使一些核心Java API接受許多不同類型的基元數組,例如Arrays.sort,它對許多不同類型的基元數組都有重載。

如果您希望對執行的操作與int[]相同,則必須提供重載方法,例如example(short[] anArray)

JLS, Section 5.1,指定所有類型的轉換,並且具體地不允許那些5.1.12未列出,「禁止轉換」:

> Any conversion that is not explicitly allowed is forbidden. 

換算類型原始陣列之間沒有列出,所以他們不允許。

0

在Java中,數組是對象,只要short數組不擴展數組,它就不能作爲參數傳遞。

換句話說,短的IS-not-A int數組。

0

可以混合使用短爲int只是標原語,這個被命名爲拓寬,通過例子,你可以這樣做:

short x = 4; 
int y = x; 

沒有問題。

根據引用的擴展可能只是標量類型而不是數組。

22個上的原始類型特定的轉換被稱爲變窄 原始轉化:

短以字節或字符

炭到字節或短

INT到字節,短,或炭

long to byte,short,char或int

浮到字節,短,字符型,整型,或長

雙到字節,短,字符型,整型,長,或浮動

甲基本收縮轉換可能會失去約數值的 整體大小信息價值並可能失去精確度和範圍。

從double到float的基元轉換範圍縮小由IEEE 754舍入規則(第4.2.4節)的 控制。此轉換可能會丟失精度,但也會丟失範圍,導致從非零的雙精度浮點數到零浮點數和從有限雙精度浮點數的浮點數無窮大。將雙NaN 轉換爲浮點型NaN,並將雙無限轉換爲 相同符號的浮點型無窮大。

帶符號的整數的收縮轉換爲整數類型T 簡單地丟棄所有,但n個最低階位,其中n是用於表示類型T.除的 信息可能丟失的比特數量 關於數值的大小,這可能導致 結果值的符號與輸入值 的符號不同。

炭的收縮轉換爲整數類型T同樣簡單地丟棄 所有,但n個最低階位,其中n是用於表示類型T.除的 信息的可能損失的 比特的數量關於數值的大小,這可能會導致 結果值爲負數,儘管字符 表示16位無符號整數值。

瞭解更多信息:http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.3

相關問題