[英]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
的非直觀行為。
這同樣適用於Long
和int
的組合,也就是當一個操作數的結果是方法調用時,例如
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.