在Java 8中无法将int强制转换为long

时间:2016-07-08 09:28:56

标签: java casting java-8

我正在将我的项目升级到Java 1.7到1.8。当我编译我的代码时,它会给出compile error,因为 int不能转换为长

这是返回原语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

2 个答案:

答案 0 :(得分:4)

数字条件表达式受“Binary Numeric Promotion”的约束,这就是为什么可以编译以下代码的原因:

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

由于两个备选方案都具有数字类型,因此应用数字提升,首先取消装箱值,然后将扩展转换应用于int操作数,因此条件表达式的结果类型为{{1} }。拳击到long之后才发生。

因此,上面的代码具有抛出Long的不直观行为,而不是直接将NullPointerException中找到的对象分配给long1,原因是取消装箱和装箱步骤。

同样适用于long2Long的组合,当一个操作数的结果是方法调用时,例如

int

可以毫无问题地编译。那有什么区别?在示例中

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

方法调用是在泛型类的实例上进行的。

The specification说:

  

...

     
      
  • 如果第二个和第三个操作数表达式都是数值表达式,则条件表达式是一个数字条件表达式。
      为了对条件进行分类,以下表达式是数字表达式:

         
        
    • 独立形式(第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实现一样。

答案 1 :(得分:1)

尝试添加&#39; L&#39;最后:

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

或者如果&#39; returnList.get(0)&#39;返回一个int,试试:

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