”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 注意 Java 中的类型转换

注意 Java 中的类型转换

发布于2024-11-08
浏览:946

Java是强类型语言,但仍然可以在不同类型的原始变量之间传递值。例如,我可以将 int 的值分配给 double ,没有任何问题,只要接收该值的类型的存储容量可以处理它。

参见下面每个原始类型的大小:

Cuidados com transferência de tipos em Java

将值转移到具有更大存储容量的类型有一个技术名称:“扩大转换”。该术语在葡萄牙语中通常被翻译为“放大转换”或“加宽转换”。它是指将较小或较受限制的数据类型的值转换为较大或较全面的类型而不丢失信息的过程。

但是如果我想将值转移到存储容量较小的类型怎么办? Java 编译器不喜欢这样,但如果您强制转换它,它会允许这样做,如下例所示。

double decimal = 65.9;
int i = (int) decimal; //aqui ele perde a casa decimal e vira 65
char c = (char) i; //aqui ele vira a letra A (que corresponde a 65)

如果传递给新类型的值的大小超出了该类型的限制,则可能会发生更戏剧性的事情。 int i = 10 适合字节变量,因为它包含 -128 到 127 范围内的 8 位。但是,如果我想将 int i = 128 放入 byte 类型的变量中该怎么办...将会有信息丢失。

public class Main
{
    public static void main(String[] args) {
        int i = 128;
        byte b = (byte) i;

        System.out.println(b); // o valor de b agora é -128 :S
    }
}

自动装箱

在上一篇文章[在这里阅读]中,我谈论了一些关于包装类的内容。作为一个例子,我写了 Integer.parse(i) = 想象 i 是一个类型
原始整数。

目前,不再鼓励使用 Wrapper 解析方法,因为它已被弃用。要将原语转换为包装类并以这种方式使用内置方法,建议进行“自动装箱”,如示例所示:

Character ch = 'a';
Integer i = 10;

请注意,这是一种更直接的方法。您只需一次分配所有值即可。

要执行相反的操作并将数据作为原始类型返回,您可以使用 valueOf:
方法进行“拆箱”

Integer i = 10;
int j = Integer.valueOf(i);

正如我在上一篇文章中所说,制作原语的包装器具有允许您使用类的方法并使处理数据时变得更轻松的优点。

原语的包装版本乍一看可能很像,但是 JVM 不会以相同的方式处理对象和原语,请不要忘记。请记住,基元进入堆栈,对象进入堆[记住这里]。

就性能而言,很明显,从原语检索数据对于计算机来说成本较低,因为值是直接存储的,而不是通过引用存储的。获取现成的数据比将各个数据片段放在内存中要快得多。

但在某些情况下,使用包装器是必不可少的。例如,当您想要使用 ArrayList 类时。它只接受对象作为参数,而不接受原始值。

这种从原始到对象的转换带来的灵活性,反之亦然,这种语言真的很酷。但我们需要意识到这里讨论的这些陷阱以及许多其他陷阱。

为了震惊社会(笑),我将举一个有问题的案例的例子,涉及重载时代码的意外行为(我还没有发表关于重载的文章,但我会的。基本上,当方法具有不同的签名时就会发生重载)。

Joshua Bloch 所著的《Effective Java》一书中提到了这个案例。

public class SetListTest {
    public static void main(String[] args) {
        Set set = new TreeSet();
        List list = new ArrayList();

        for (int i = -3; i 



在此程序中,目标是将 -3 到 2 [-3, -2, -1, 0, 1, 2] 的整数值添加到集合和列表中。然后删除正值[0,1和2]。但是,如果运行此代码,您会注意到集合和列表没有呈现相同的结果。正如预期的那样,该集合返回 [-3, -2, -1]。列表返回 [-2, 0, 2].

发生这种情况是因为对 List 类的内置 remove(i) 方法的调用将 i 视为基本类型 int,而不是其他类型。该方法依次删除位置 i 处的元素。

对Set类的remove(i)方法的调用调用了一个重载,该重载接收一个Integer对象作为参数,自动将原本是int的i转换为Integer。反过来,此方法的行为会从集合中排除值等于 i(而不是等于 i 的索引)的元素 - 请注意,集合和列表的预期类型都是 Integer。 (设置设置/列表列表)。这就是为什么为 Set 类的 remove 方法选择重载,将其转换为 Integer。

List中的remove行为是按索引删除,而Set中的remove是按值删除。所有这些都是由于接收 Integer.

的remove 超载造成的
版本声明 本文转载于:https://dev.to/anaccortez/cuidados-com-transferencia-de-tipos-em-java-10he?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何在鼠标单击时编程选择DIV中的所有文本?
    如何在鼠标单击时编程选择DIV中的所有文本?
    在鼠标上选择div文本单击带有文本内容,用户如何使用单个鼠标单击单击div中的整个文本?这允许用户轻松拖放所选的文本或直接复制它。 在单个鼠标上单击的div元素中选择文本,您可以使用以下Javascript函数: function selecttext(canduterid){ if(do...
    编程 发布于2025-05-20
  • 在JavaScript中如何并发运行异步操作并正确处理错误?
    在JavaScript中如何并发运行异步操作并正确处理错误?
    同意操作execution 在执行asynchronous操作时,相关的代码段落会遇到一个问题,当执行asynchronous操作:此实现在启动下一个操作之前依次等待每个操作的完成。要启用并发执行,需要进行修改的方法。 第一个解决方案试图通过获得每个操作的承诺来解决此问题,然后单独等待它们: co...
    编程 发布于2025-05-20
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-05-20
  • Java中假唤醒真的会发生吗?
    Java中假唤醒真的会发生吗?
    在Java中的浪费唤醒:真实性或神话?在Java同步中伪装唤醒的概念已经是讨论的主题。尽管存在这种行为的潜力,但问题仍然存在:它们实际上是在实践中发生的吗? Linux的唤醒机制根据Wikipedia关于伪造唤醒的文章,linux实现了pthread_cond_wait()功能的Linux实现,利用...
    编程 发布于2025-05-20
  • 如何在php中使用卷发发送原始帖子请求?
    如何在php中使用卷发发送原始帖子请求?
    如何使用php 创建请求来发送原始帖子请求,开始使用curl_init()开始初始化curl session。然后,配置以下选项: curlopt_url:请求 [要发送的原始数据指定内容类型,为原始的帖子请求指定身体的内容类型很重要。在这种情况下,它是文本/平原。要执行此操作,请使用包含以下标头...
    编程 发布于2025-05-20
  • 为什么我会收到MySQL错误#1089:错误的前缀密钥?
    为什么我会收到MySQL错误#1089:错误的前缀密钥?
    mySQL错误#1089:错误的前缀键错误descript [#1089-不正确的前缀键在尝试在表中创建一个prefix键时会出现。前缀键旨在索引字符串列的特定前缀长度长度,可以更快地搜索这些前缀。了解prefix keys `这将在整个Movie_ID列上创建标准主键。主密钥对于唯一识别...
    编程 发布于2025-05-20
  • 在Python中如何创建动态变量?
    在Python中如何创建动态变量?
    在Python 中,动态创建变量的功能可以是一种强大的工具,尤其是在使用复杂的数据结构或算法时,Dynamic Variable Creation的动态变量创建。 Python提供了几种创造性的方法来实现这一目标。利用dictionaries 一种有效的方法是利用字典。字典允许您动态创建密钥并分...
    编程 发布于2025-05-20
  • Python元类工作原理及类创建与定制
    Python元类工作原理及类创建与定制
    python中的metaclasses是什么? Metaclasses负责在Python中创建类对象。就像类创建实例一样,元类也创建类。他们提供了对类创建过程的控制层,允许自定义类行为和属性。在Python中理解类作为对象的概念,类是描述用于创建新实例或对象的蓝图的对象。这意味着类本身是使用类关...
    编程 发布于2025-05-20
  • 如何有效地转换PHP中的时区?
    如何有效地转换PHP中的时区?
    在PHP 利用dateTime对象和functions DateTime对象及其相应的功能别名为时区转换提供方便的方法。例如: //定义用户的时区 date_default_timezone_set('欧洲/伦敦'); //创建DateTime对象 $ dateTime = ne...
    编程 发布于2025-05-20
  • 如何在Chrome中居中选择框文本?
    如何在Chrome中居中选择框文本?
    选择框的文本对齐:局部chrome-inly-ly-ly-lyly solument 您可能希望将文本中心集中在选择框中,以获取优化的原因或提高可访问性。但是,在CSS中的选择元素中手动添加一个文本 - 对属性可能无法正常工作。初始尝试 state)</option> < op...
    编程 发布于2025-05-20
  • 如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解决方案: args)抛出异常{ 日历cal = calendar.getInstance(); SimpleDateFormat SDF =新的SimpleDateFormat(“...
    编程 发布于2025-05-20
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-05-20
  • 如何实时捕获和流媒体以进行聊天机器人命令执行?
    如何实时捕获和流媒体以进行聊天机器人命令执行?
    在开发能够执行命令的chatbots的领域中,实时从命令执行实时捕获Stdout,一个常见的需求是能够检索和显示标准输出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    编程 发布于2025-05-20
  • C++成员函数指针正确传递方法
    C++成员函数指针正确传递方法
    如何将成员函数置于c [&& && && && && && && && && && &&&&&&&&&&&&&&&&&&&&&&&华仪的函数时,在接受成员函数指针的函数时,要在函数上既要提供指针又可以提供指针和指针到函数的函数。需要具有一定签名的功能指针。要通过成员函数,您需要同时提供对象指针(此...
    编程 发布于2025-05-20

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3