簡體   English   中英

帶有“表達式”的Java類型提升

[英]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會將所有字節提升為整數。

好吧,在某些情況下。 並非在所有情況下都如此。

從根本上講,該代碼不會編譯,因為沒有從bytechar隱式轉換。 JLS的5.1.2節 (擴展原始轉換)開始:

關於原始類型的19種特定轉換稱為擴展原始轉換:

  • byteshortintlongfloatdouble
  • ...

請注意,從byte轉換的目標類型列表中缺少char

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM