簡體   English   中英

為什么Java 12會嘗試將交換機的結果轉換為數字?

[英]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.

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