Java Auto Boxing和条件运算符

Lav*_*Lav 2 java autoboxing sonarqube

在声纳中,我看到了代码的重大违规警告

  public Long getValue(FieldType fieldType) {
    Long value = paramLevelMap.get(fieldType); // ok returns Long not long
    return value == null ? UNSPECIFIED_PARAMETER_KEY : value; // complaints here
  } 
Run Code Online (Sandbox Code Playgroud)

其中'UNSPECIFIEDpa_PARAMETER_KEY'是pvt static long,'value'也很长.

盒装值未装箱,然后立即重新装箱

它在第二行抱怨.我不太明白它,何时原始长度被转换为相应的类对象?然后回来 ?

Kep*_*pil 6

三元(或更正确的,条件)表达式的返回类型,其中第二和第三操作数由一个基元和一个对应的盒装版本组成,是基元的返回类型.
(有关条件运算符类型的完整分析,请查看Java规范15.25.)

由于这里的第二个操作数UNSPECIFIED_PARAMETER_KEY是a long,而第三个value是a Long,因此Java必须将unbox转换value为a long来评估表达式.

在此之后,Long将返回a,因此value立即重新装箱.

您可以通过将常量更改UNSPECIFIED_PARAMETER_KEY为a 来解决此问题Long.