[英]Why does Java 12 try to convert the result of a switch to a number?
我同意這段代碼:
var y = switch (0) {
case 0 -> '0';
case 1 -> 0.0F;
case 2 -> 2L;
case 3 -> true;
default -> 4;
};
System.out.println(y);
System.out.println(((Object) y).getClass().getName());
返回:
0
java.lang.Character
但是如果刪除布爾值:
var y = switch (0) {
case 0 -> '0';
case 1 -> 0.0F;
case 2 -> 2L;
default -> 4;
};
System.out.println(y);
System.out.println(((Object) y).getClass().getName());
返回:
48.0
java.lang.Float
我想這個結果是出乎意料的。
根據switch表達式的JEP ,switch表達式是poly表達式:
switch表達式是poly表達式; 如果目標類型已知,則將此類型下推到每個臂中。 switch表達式的類型是其目標類型(如果已知); 如果不是,則通過組合每個案例臂的類型來計算獨立類型。
因為您沒有目標類型,所以不檢查表達式以匹配任何給定類型,這是預期的。
您可以通過將var
替換為類型來驗證這一點:
int y = switch (0) {
case 0 -> '0';
case 1 -> 0.0F;
case 2 -> 2L;
case 3 -> true;
default -> 4;
};
在我的shell中,這失敗了:
| Error:
| incompatible types: bad type in switch expression
| possible lossy conversion from float to int
| case 1 -> 0.0F;
| ^--^
| Error:
| incompatible types: bad type in switch expression
| possible lossy conversion from long to int
| case 2 -> 2L;
| ^^
| Error:
| incompatible types: bad type in switch expression
| boolean cannot be converted to int
| case 3 -> true;
| ^--^
但是如果刪除布爾值:...
它應該足以看到如何確定獨立類型( 規則在這里 ):
獨立開關表達式的類型確定如下 :
- 如果結果表達式都具有相同的類型(可能是null類型),那么這就是switch表達式的類型。
- 否則,如果每個結果表達式的類型是布爾值或布爾值,則對每個類型為Boolean的結果表達式應用拆箱轉換(5.1.8),並且switch表達式的類型為boolean。
否則,如果每個結果表達式的類型可轉換為數字類型(5.1.8),則switch表達式的類型是應用於結果表達式的數字提升(5.6)的結果。
否則,裝箱轉換(5.1.7)將應用於具有基本類型的每個結果表達式,之后切換表達式的類型是將捕獲轉換(5.1.10)應用於最小上限的結果(4.10.4 )結果表達式的類型。
據我所知,當你刪除布爾表達式時,你會留下數字表達式( char
'0'
( int 48
)被提升為float
48.0
)。 見上面第三點。
至於為什么float
是結果的類型,請參閱Numeric Contexts部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.