b6由於文字常量的編譯時縮小而工作。 B7不起作用,因爲編譯時縮小被限制在所有原始數據,但長期(有點怪,不知道爲什麼)
有趣的部分是§5.2 of the JLS:
In addition, if the expression is a constant expression (§15.28) of type byte, short, char or int :
A narrowing primitive conversion may be used if the type of the variable is byte, short, or char, and the value of the constant expression is representable in the type of the variable.
A narrowing primitive conversion followed by a boxing conversion may be used if the type of the variable is :
- Byte and the value of the constant expression is representable in the
type byte.
- Short and the value of the constant expression is representable in
the type short.
- Character and the value of the constant expression is representable in the type char.
If the type of the expression cannot be converted to the type of the variable by a conversion permitted in an assignment context, then a compile-time error occurs.
不知道爲什麼i
沒有工作,雖然 - 擴大應該工作得很好,事實上,編譯器無論如何應該產生類似Integer.valueOf((byte)3);
的東西。使用顯式調用按預期工作,即正在擴大。
有趣的是,使用eclipse Java編譯器Integer i = (byte) 3;
編譯得很好,這讓我相信你剛剛在javac中發現了一個錯誤 - 恭喜! (或者是eclipse編譯器中的錯誤,但是eclipse的行爲對我來說似乎是正確的)。 FWIW我已經向oracle報告了針對javac的錯誤..
在JLS中找到正確的部分比格式化工作要少,因爲它有點可讀 - 如果您按照鏈接進行操作,可能會更容易。
來源
2012-02-20 23:38:49
Voo
沒有錯誤信息和投訴的行號,這是很難回答的。 – bmargulies 2012-02-20 18:26:22
另外,'byte x = 126 + 1;'有效,但不能'byte y = 126 + 2;'不知何故,當使用可計算的值時,編譯器檢查容器是否足夠寬。雖然在JLS中找不到引用。 – gawi 2012-02-20 18:40:03
這是在這個問題的答案中詳細討論:[鏈接](http://stackoverflow.com/questions/81392/java-why-do-i-receive-the-error-message-type-mismatch-cannot -convert-int-to-b) – 2012-02-20 18:49:05