为什么将原始类型转换为引用类型会产生编译错误?

Why does casting a primitive type to a reference type is giving compilation error?

我想知道为什么将原始数据类型(例如int)转换为引用类型(例如Long)无法编译?

BinaryOperator<Long> add = (x, y) -> x + y;
System.out.println(add.apply((Long)8, (Long)5)); //this line does not compile
System.out.println(add.apply((long)8, (long)5)); // this line does compile

我很乐意得到一些详细的答案。谢谢。

因为这个

Long l = 1; 

表示将一个int(不带浮点数的字面量为int)赋值给一个Object,这里是Long.
Java 5 中引入的自动装箱功能不允许从 int 装箱到 Integer 以外的其他东西。所以 Long 作为目标类型是不可接受的,但这个是:

Integer i = 1;  

在您的工作示例中,您将 int 转换为 long :(long)8
所以编译器可以完美地将 long 装箱到 Long.

long 是原始数据类型,但 Long 是(包装器)class。

以下应该有效。

System.out.println(add.apply(Long.valueOf(8), Long.valueOf(5)));