繁体   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