java:自动装箱和铸造?

java:自动装箱和铸造?,java,autoboxing,Java,Autoboxing,我被一个小问题弄糊涂了,请参见以下内容: Double j = new Double(5); // No problem. double j =5;// //But //Here the problem: Double j = 5; Long k =5; Float g = 5.0; 我知道解决方案,但我想了解为什么在某些情况下,强制转换是隐式进行的,而在其他情况下则不是。 Double j = new Double(5); 因为Java将5从int转换为

我被一个小问题弄糊涂了,请参见以下内容:

Double j = new Double(5); // No problem.
double j =5;//

         //But

//Here the problem:

Double j = 5;
Long k =5;      
Float g = 5.0;

我知道解决方案,但我想了解为什么在某些情况下,强制转换是隐式进行的,而在其他情况下则不是。

Double j = new Double(5);
因为Java将
5
int
转换为
double
构造函数将采用的
double
。它还将该行的
5
转换为
double

double j =5;
这是一个不断扩大的原语转换

这些线路有问题

Double j = 5;
Long k =5;      
Float g = 5.0;
Java不会隐式地执行扩展原语转换(
5
5.0
5L
)和装箱转换(
double
double
long
long
)。它将隐式执行其中一个,但不能同时执行两个。它也不会在此处执行缩小原语转换(
5.0
5.0f

报告指出:

分配上下文允许使用以下内容之一:

  • 身份转换(§5.1.1)

  • 扩大原语转换(§5.1.2)

  • 拓宽参考转换(§5.1.5)

  • 装箱转换(§5.1.7)后可选加宽参考转换

  • 取消装箱转换(§5.1.8)后可选地进行加宽原语转换

它不明确地允许最后3行尝试执行的操作:先进行扩展原语转换,然后进行装箱转换

有趣的是,Java确实允许:

Number x = 5;  // boxing followed by widening
double y = new Integer(5);  // unboxing followed by widening

这三个赋值的问题是,尽管Java有关于扩展原语到原语转换的规则,但它没有关于原语到包装器转换的规则。换句话说,除了自动装箱之外,没有任何规则可以进行转换

Double j = 5;  // 5 is an int literal. It can be auto-boxed only to Integer
Long k =5;     // Same here
Float g = 5.0; // 5.0 is a double literal. It can be auto-boxed only to Double
您可以通过添加适当的后缀或适当的强制转换来修复这些问题,如下所示:

Double j = (double)5;
Long k = 5L;      
Float g = (float)5.0;
双j=新双(5); 双k=j

这里发生了拆箱。从包装器对象获取值并分配给基本数据类型(int、doulbe、float) 双k=j;等于j.doubleValue();返回类型为双精度

双j=5

如果要这样使用,必须提到数据类型, 双a=(双)5;或双a=双。值(5)


这是自动装箱。不知道数据类型不能进行java强制转换,否则您应该给出正确的原始数据类型(5.0)。

code>double d=5//加宽

在上面的语句中,加宽是从原语
int
double

Double d=新的Double(5)//使用包装类构造函数并将其与
int
类型值5一起传递,但是返回包装类
Double
reference
d
并引用值5.0,因为
jvm
将在
int
上进行
加宽
,并返回包装类
Double
构造函数使用的
Double
类型5.0

Double d=5.0
//是自动装箱,类似于
Double d=new Double(5)


但是,
Double d=5
//错误,因为
int
类型值5不能
自动装箱到
double
类型值并由
double
类型引用变量引用。jvm不会对包装类引用变量所引用的值执行这样的基元类型加宽。

根本不清楚您在问什么。“问题”是什么?解释什么东西不能按你期望的方式工作。我怀疑
double j=5将在不给出编译时警告/错误的情况下工作!!!不应该是
double j=5d?@shekharsuman Java允许隐式扩展原语转换。
int
literal
5
将被隐式转换为
5.0
。有人知道为什么Java的人决定不允许隐式扩展吗?