簡體   English   中英

在Java 8中無法將int強制轉換為long

[英]Cannot cast int to long in Java 8

我正在將我的項目升級到Java 1.7到1.8。 當我編譯我的代碼時,它會產生compile error因為int無法轉換為long

這是返回原始long的表達式。

public Long getOrganizationIdByUser(String userId){

        Query query = getSession().getNamedQuery("getOrganizationIdByUser");
        query.setString("id", userId!=null?_userId.toLowerCase():null);

        List<Long> returnList = query.list();
        return returnList!=null&&returnList.size()>0?returnList.get(0):0;

    }

我很困惑為什么0不能在java 1.8中強制轉換為長,因為這是java中的基本概念,並且它在java 1.7中也能正常工作。

錯誤

error: incompatible types: bad type in conditional expression
    [javac]         return returnList!=null&&returnList.size()>0?returnList.get(0):0;
    [javac]                                                                      
    [javac]     int cannot be converted to Long

數字條件表達式受“ 二進制數字促銷 ”的約束,這就是為什么可以編譯以下代碼的原因:

Long long1   = null;
Integer int1 = null;
Long long2 = true? long1: int1;

由於兩個備選方案都具有數字類型,因此應用數字提升,首先將值取消裝箱,然后將擴展轉換應用於int操作數,因此條件表達式的結果類型為long 之后,拳擊到Long發生了。

因此,由於取消裝箱和裝箱步驟,上面的代碼具有拋出NullPointerException而不是直接將long1找到的對象分配給long2的非直觀行為。


這同樣適用於Longint的組合,也就是當一個操作數的結果是方法調用時,例如

static Long test() {
    return Math.random()<0.5? test(): 0;
}

可以編譯沒有問題。 那有什么區別? 在示例中

public Long test() {
    List<Long> returnList = new ArrayList<Long>();
    return returnList!=null&&!returnList.isEmpty()? returnList.get(0): 0;
}

方法調用是在泛型類的實例上進行的。

規范說:

...

  • 如果第二個和第三個操作數表達式都是數值表達式 ,則條件表達式是數字條件表達式。
    為了對條件進行分類,以下表達式是數字表達式:

    • 表達獨立形式(第15.2節),其類型可轉換為數字類型(§4.2,§5.1.8)。

    • 帶括號的數字表達式(第15.8.5節)。

    • 可轉換為數字類型的類的類實例創建表達式(第15.9節)。

    • 方法調用表達式(第15.12節),其中所選擇的最具體方法(第15.12.2.5節)具有可轉換為數字類型的返回類型。

    • 數字條件表達式

請注意,與Java 7相比,這已經發生了變化,因為引入了“獨立表單”表達式,這與受到目標類型操作的“多表達式”相反。

要檢查方法調用是獨立表達式還是多表達式,我們必須參考JLS§15.12

如果滿足以下所有條件,則方法調用表達式是poly表達式:

  • 調用出現在賦值上下文或調用上下文中(第5.2節,第5.3節)。

  • 如果調用是限定的(即,除了第一個之外的任何形式的MethodInvocation),則調用將標識符左側的TypeArguments消除。

  • 由以下小節確定的要調用的方法是通用的(第8.4.4節),並且具有提及方法的類型參數中的至少一個的返回類型。

否則,方法調用表達式是一個獨立的表達式。

在我們的例子中,最后一顆子彈不適用。 此方法是泛型類的成員,但它本身不是通用的,因為它不聲明類型參數,因此它的返回類型不引用方法的類型參數,因為沒有。

換句話說,此方法調用是一個獨立的表達式,具有數字返回類型,因此條件表達式是一個數字條件表達式,並且應該像其他示例一樣受二進制數字促銷的約束。


請注意,所有最近的Java 9實現都會編譯此代碼,就像Java 6和Java 7實現一樣。

嘗試在最后添加“L”:

returnList != null && returnList.size()>0 ? returnList.get(0) : 0L;

或者如果'returnList.get(0)'返回一個int,請嘗試:

returnList != null && returnList.size()>0 ? (long)returnList.get(0) : 0L;

暫無
暫無

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

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