为什么这会返回错误和真实?

Lig*_*uzz 6 java

public class Test {
    public static final Double DEFAULT_DOUBLE = 12.0;
    public static final Long DEFAULT_LONG = 1L;

    public static Double convertToDouble(Object o) {
        return (o instanceof Number) ? ((Number) o).doubleValue()
                : DEFAULT_DOUBLE;
    }

    public static Long convertToLong(Object o) {
        return (o instanceof Number) ? ((Number) o).longValue() : DEFAULT_LONG;
    }

    public static void main(String[] args){
        System.out.println(convertToDouble(null) == DEFAULT_DOUBLE);
        System.out.println(convertToLong(null) == DEFAULT_LONG);
    }
}
Run Code Online (Sandbox Code Playgroud)

ass*_*ias 8

编辑

三元运算符在引擎盖下进行某些类型的转换.在你的情况下,你是混合原语和包装类型,在这种情况下包装类型被取消装箱,然后三元运算符的结果被"重新装箱":

如果第二个和第三个操作数之一是原始类型T,而另一个操作数的类型是将装箱转换(第5.1.7节)应用于T的结果,那么条件表达式的类型是T.


所以你的代码基本上等同于(除了longValue应该是的拼写错误doubleValue):

public static void main(String[] args){
    Double d = 12.0;
    System.out.println(d == DEFAULT_DOUBLE);

    Long l = 1L;
    System.out.println(l == DEFAULT_LONG);
}
Run Code Online (Sandbox Code Playgroud)

可以在某些JVM上缓存长值,==因此比较可以返回true.如果你做了所有的比较,equals那么true两种情况都会得到.

请注意,如果您使用public static final Long DEFAULT_LONG = 128L;并尝试:

Long l = 128L;
System.out.println(l == DEFAULT_LONG);
Run Code Online (Sandbox Code Playgroud)

它可能会打印为false,因为Long值通常仅在-128和+127之间缓存.

注:JLS要求char,byte以及int-127和+128之间的值被缓存,但没有说任何东西long.因此,您的代码实际上可能会在不同的JVM上打印两次false.