[英]Java type promotion with “expressions”
如果下面的變量(稱為b)是唯一位於等號右邊的變量,它可以稱為表達式嗎?
// This code fragment will not compile.
// c is a char, and b is a byte.
c = b;
我之所以問這個問題,是因為表達式中的類型提升這一主題。 我知道Java會將所有字節提升為整數。 這是該代碼片段無法編譯的唯一原因嗎? (請注意,我了解演員表;這不是該主題的重點。非常感謝。)
編輯:非常感謝喬恩和彼得。 使用第二個示例查看此主題:
byte b = 1;
short s = 2;
s = b; // OK
s = b*2; // Not OK (compilation error)
是否確實發生了以下情況?
(第3行)Java將字節轉換為short。 (第4行)Java將表達式b * 2轉換為int。
如果這是正確的,那么看來= b; 和= b * 2; 是Java處理不同的“表達式”。 因此,= b; “表達式”不轉換為整數,而是擴展為短整數。 但是= b * 2; 即使稱為s的目標變量是short,表達式也會轉換為int而不是short。
編輯2:也是-
short s1, s2 = 2, s3 = 2;
s1 = s2*s3; // Not OK (compilation error)
即使所有三個變量都是短褲,s2 * s3; 表達式提升為int,從而導致編譯錯誤。
嘗試這個
byte b = -1;
short s = b; // is ok as a byte can be promoted to an short.
int i = b; // is ok as a byte can be promoted to an int.
float f = b; // is ok as a byte can be promoted to an float, long or double.
char c = b; // won't compile
但
final byte b = 1;
char c = b; // compiles fine as the compiler can inline the value.
在這種情況下
short s = b*2; // Not OK (compilation error)
b * 2是一個int
因為2
是一個int
數值。 如果b
是最終的,則可以執行此操作,因為編譯可以內聯該值。
如果下面的變量(稱為b)是唯一位於等號右邊的變量,它可以稱為表達式嗎?
是的,一點沒錯。
我知道Java會將所有字節提升為整數。
好吧,在某些情況下。 並非在所有情況下都如此。
從根本上講,該代碼不會編譯,因為沒有從byte
到char
隱式轉換。 從JLS的5.1.2節 (擴展原始轉換)開始:
關於原始類型的19種特定轉換稱為擴展原始轉換:
byte
到short
,int
,long
,float
或double
- ...
請注意,從byte
轉換的目標類型列表中缺少char
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.