为避免混淆,我正在查找RULE/JLS条目.

  • 我不是问为什么Double -> int个会失败,我是问它失败的way

  • 我知道有损失的转换,正如我在我的问题中提到的-我不是问double -> int个%之间的数据丢失

  • 我不是在要求某人对开发人员为什么以这种方式设计它进行"最佳猜测"

我的问题是,为什么Integer -> double个执行转换(取消装箱和加宽),而Double -> int个不执行转换(甚至不取消装箱)

我正在寻找提到Reference -> primitive转换不一致的JLS条目,其中取消装箱在一种情况下发生,但在另一种情况下不发生.


Integer -> double个转换编译时没有错误

double d = Integer.valueOf(1);

这意味着会发生以下情况:

  1. Integer等于unboxedint
  2. int的值从int -> double个到widening primitive conversion

Integer未打包.然后扩大未装箱的值.这提供了与int -> double个相同的行为


这产生了这样的假设,即Double -> int个也将取消装箱,给出与double -> int个相同的行为

以获取代码

int i = Double.valueOf(1);

我预计会出现错误消息

从双精度到整型的有损转换

假设Double被取消装箱,我们应该观察到与double -> int个相同的行为

相反,我们会收到一个输入错误

无法将双精度型转换为整型


这种行为背后的解释是什么?

为什么在Integer -> double个之间发生取消装箱,而在Double -> int个之间没有取消装箱?

为什么这些是一致的:

  • Integer -> double
  • int -> double

但这些并不是:

  • Double -> int
  • double -> int

推荐答案

有一个表格显示了§5.5以内的允许转换率:

  • 表示不允许转换
  • ω表示扩大了基元转换
  • ⊗表示取消装箱转换

enter image description here

该表显示了Integer -> double执行取消装箱和放大转换,但Double -> int不执行取消装箱.

因为没有发生取消装箱,所以我们得到的是类型错误,而不是有损的转换错误.

Java相关问答推荐

try Dockerize Maven应用程序,但发布版本21不支持"

将具有多个未知字段的SON映射到Java POJO

使用Java Streams API比较两个不同的Java集合对象和一个公共属性

Java .类参数不通过构造函数传递

如何以干净的方式访问深度嵌套的对象S属性?

如何使用Maven和Spring Boot将构建时初始化、跟踪类初始化正确传递到本机编译

调用引发泛型异常的泛型方法时出现编译错误

在Java中如何从Executors.newFixedThreadPool(MAX_THREAD_COUNT())迁移到虚拟线程

如何在列表(链表)中插入一个新 node (作为prelast)

我如何为我的Java抵押贷款代码执行加薪操作(&Q)

Java中HashSet的搜索时间与TreeSet的搜索时间

将双倍转换为百分比

Java 21中泛型的不兼容更改

为什么这种递归会有这样的行为?

没有Tomcat,IntelliJ如何在本地运行API?

在Java中使用StorageReference将数据从Firebase存储添加到数组列表

PhantomReference无法访问时会发生什么?

如何使用stream.allMatch()为空流返回false?

获取401未经授权,即使在标头中设置了浏览器名称和cookie

使用Java线程进行并行编程