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