java类型窄化转换,Java的有损转换

1. 概述

在这个快速教程中,我们将讨论Java中有损转换的概念及其背后的原因。

同时,我们将探索一些方便的转换技术来避免这个错误。

2. 有损转换

有损转换就是处理数据时信息的丢失。

在Java中,它对应于在将一种类型转换为另一种类型时丢失变量值或精度的可能性。

当我们尝试将一个高级类型的变量转换成一个低级类型时,Java将在编译代码时生成一个错误的、不兼容的类型:可能的有损转换。

例如,让我们尝试将一个long值赋给一个int值:

long longNum = 10;

int intNum = longNum;复制代码

在编译此代码时,Java会产生一个错误:

incompatible types: possible lossy conversion from long to int复制代码

在这里,Java将发现long和int不兼容,并导致有损转换错误。因为在int范围-2,147,483,648到2,147,483,647之外可以有long值。

类似地,我们试着给一个 long 赋给一个 float :

float floatNum = 10.12f;

long longNum = floatNum;

incompatible types: possible lossy conversion from float to long复制代码

因为float可以表示一些没有相应long类型的小数值。因此,我们将收到相同的错误。

同样,将一个 double 转换成 int 也会导致相同的错误:

double doubleNum = 1.2;

int intNum = doubleNum;

incompatible types: possible lossy conversion from double to int复制代码

double值对于int值来说可能太大或太小,小数值将在转换中丢失。因此,这是一个潜在的有损转换。

此外,在执行简单计算时,我们可能会遇到此错误:

int fahrenheit = 100;

int celcius = (fahrenheit - 32) * 5.0 / 9.0;复制代码

当一个double值乘与一个int值,我们得到的结果是一个double值。因此,它也是一个潜在的有损转换。

因此,有损转换中不兼容的类型可以有不同的大小或类型(整数或小数)。

3. 基本数据类型

在Java中,有许多基本数据类型和它们对应的包装类。

接下来,让我们列出一个Java中所有可能的有损转换的列表:

short to byte or char

char to byte or short

int to byte, short or char

long to byte, short, char or int

float to byte, short, char, int or long

double to byte, short, char, int, long or float

请注意,虽然short和char的范围相同。不过,从short到char的转换是有损的,因为char是无符号数据类型。

4. 转换技术

4.1. 两个基本数据类型之间的转换

基本类型避免有损转换的简单方法是通过向下强制转换;换句话说,将高级类型强制转换为低级的类型。因此,它也被称为窄化原始转换(narrowing primitive conversion)。

例如,让我们使用向下强制转换将 long 转换为 short :

long longNum = 24;

short shortNum = (short) longNum;

assertEquals(24, shortNum);复制代码

同样地,将一个 double 转换成一个 int:

double doubleNum = 15.6;

int integerNum = (int) doubleNum;

assertEquals(15, integerNum);复制代码

但是,我们应该注意到,通过向下强制转换将值过大或过小的高级类型转换为低级类型会导致意外值。

我们将一个long值转换成short类型范围以外的值:

long largeLongNum = 32768;

short minShortNum = (short) largeLongNum;

assertEquals(-32768, minShortNum);

long smallLongNum = -32769;

short maxShortNum = (short) smallLongNum;

assertEquals(32767, maxShortNum);复制代码

如果我们仔细分析转换,就会发现这些不是预期值。

换句话说,当Java在从高级类型转换为低级类型时,达到低级类型的最大值时,下一个值就是低级类型的最小值,反之亦然。

让我们通过例子来理解这一点。当将值为32768的 largeLongNum 转换为short时,shortNum1 的值为-32768。因为 short 的最大值是32767,所以Java会选择 short 的下一个最小值。

类似地,当 smallLongNum 转换为 short 时。shortNum2的值是32767,Java将其作为 short 的下一个最大值。

另外,让我们看看当我们将 long 的最大和最小值转换为 int 时会发生什么:

long maxLong = Long.MAX_VALUE;

int minInt = (int) maxLong;

assertEquals(-1, minInt);

long minLong = Long.MIN_VALUE;

int maxInt = (int) minLong;

assertEquals(0, maxInt);复制代码

4.2. 在包装对象和基本类型之间转换

要将包装对象直接转换为基本类型,我们可以在包装类中使用各种方法,如intValue()、shortValue()和longValue()。这叫做拆箱。

例如,让我们将Float对象转换为long:

Float floatNum = 17.564f;

long longNum = floatNum.longValue();

assertEquals(17, longNum);复制代码

此外,如果我们查看 longValue 或类似方法的实现,我们将发现窄化原始转换的用法:

public long longValue() {

return (long) value;

}复制代码

但是,有时应避免窄化原始转换以保存有价值的信息:

Double doubleNum = 15.9999;

long longNum = doubleNum.longValue();

assertEquals(15, longNum);复制代码

转换后,longNum 的值为15。然而,doubleNum 是15.9999,非常接近16。

相反,我们可以使用 Math.round() 转换为最接近的整数:

Double doubleNum = 15.9999;

long longNum = Math.round(doubleNum);

assertEquals(16, longNum);复制代码

4.3. 在包装对象之间转换

为此,让我们使用已经讨论过的转换技术。

首先,我们将把包装器对象转换为一个基本值,向下强制转换它并将它转换为另一个包装器对象。换句话说,我们将执行拆箱、向下强制类型转换和装箱技术。

例如,让我们将 Double 对象转换为 Integer 对象:

Double doubleNum = 10.3;

double dbl = doubleNum.doubleValue(); // unboxing

int intgr = (int) dbl; // downcasting

Integer intNum = Integer.valueOf(intgr);

assertEquals(Integer.valueOf(10), intNum);复制代码

最后,我们使用Integer. valueof()将基本类型 int 转换为 Integer 对象。这种类型的转换称为装箱。

5. 总结

在本文中,我们通过示例探讨了Java中有损转换的概念。此外,我们还编写了一个方便的列表,其中列出了Java中所有可能的有损转换。

在此过程中,我们已经确定了窄化原始转换是一种简单的方法来转换基本类型并避免有损的转换错误。

同时,我们还探索了Java中用于数值转换的其他方便技术。

本文的代码实现可以在GitHub项目中找到。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值