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

注意 Java 中的类型转换

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

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]删除
最新教程 更多>
  • 如何使用“ JSON”软件包解析JSON阵列?
    如何使用“ JSON”软件包解析JSON阵列?
    parsing JSON与JSON软件包 QUALDALS:考虑以下go代码:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    编程 发布于2025-04-07
  • 为什么我会收到MySQL错误#1089:错误的前缀密钥?
    为什么我会收到MySQL错误#1089:错误的前缀密钥?
    mySQL错误#1089:错误的前缀键错误descript [#1089-不正确的前缀键在尝试在表中创建一个prefix键时会出现。前缀键旨在索引字符串列的特定前缀长度长度,以便更快地搜索这些前缀。理解prefix keys `这将在整个Movie_ID列上创建标准主键。主密钥对于唯一识别...
    编程 发布于2025-04-07
  • 为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    查询模式实现缺失:解决“无法找到”错误在Silverlight应用程序中,尝试使用LINQ建立LINQ连接以错误而实现的数据库”,无法找到查询模式的实现。”当省略LINQ名称空间或查询类型缺少IEnumerable 实现时,通常会发生此错误。 解决问题来验证该类型的质量是至关重要的。在此特定实例中...
    编程 发布于2025-04-07
  • 如何从Google API中检索最新的jQuery库?
    如何从Google API中检索最新的jQuery库?
    从Google APIS 问题中提供的jQuery URL是版本1.2.6。对于检索最新版本,以前有一种使用特定版本编号的替代方法,它是使用以下语法:获取最新版本:未压缩)While these legacy URLs still remain in use, it is recommended ...
    编程 发布于2025-04-07
  • 如何有效地选择熊猫数据框中的列?
    如何有效地选择熊猫数据框中的列?
    在处理数据操作任务时,在Pandas DataFrames 中选择列时,选择特定列的必要条件是必要的。在Pandas中,选择列的各种选项。选项1:使用列名 如果已知列索引,请使用ILOC函数选择它们。请注意,python索引基于零。 df1 = df.iloc [:,0:2]#使用索引0和1 c...
    编程 发布于2025-04-07
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-04-07
  • 如何同步迭代并从PHP中的两个等级阵列打印值?
    如何同步迭代并从PHP中的两个等级阵列打印值?
    同步的迭代和打印值来自相同大小的两个数组使用两个数组相等大小的selectbox时,一个包含country代码的数组,另一个包含乡村代码,另一个包含其相应名称的数组,可能会因不当提供了exply for for for the uncore for the forsion for for ytry...
    编程 发布于2025-04-07
  • 对象拟合:IE和Edge中的封面失败,如何修复?
    对象拟合:IE和Edge中的封面失败,如何修复?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    编程 发布于2025-04-07
  • 可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html posite:sticky; sticky; .Sticky-1 {[ top:1em; z-index:1; 1; { display:gr...
    编程 发布于2025-04-07
  • 如何限制动态大小的父元素中元素的滚动范围?
    如何限制动态大小的父元素中元素的滚动范围?
    在交互式接口中实现垂直滚动元素的CSS高度限制问题: 考虑一个布局,其中我们具有可滚动的映射div,该图像div与用户的垂直滚动一起移动,同时维持固定的固定sidebar。但是,地图的滚动无限期扩展,超过了视口的高度,阻止用户访问页面页脚。 映射{} 因此。我们不使用jQuery的“ .aim...
    编程 发布于2025-04-07
  • Android如何向PHP服务器发送POST数据?
    Android如何向PHP服务器发送POST数据?
    在android apache httpclient(已弃用) httpclient httpclient = new defaulthttpclient(); httppost httppost = new httppost(“ http://www.yoursite.com/script.p...
    编程 发布于2025-04-07
  • 如何在JavaScript对象中动态设置键?
    如何在JavaScript对象中动态设置键?
    在尝试为JavaScript对象创建动态键时,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正确的方法采用方括号: jsobj ['key''i] ='example'1; 在JavaScript中,数组是一...
    编程 发布于2025-04-07
  • 如何将来自三个MySQL表的数据组合到新表中?
    如何将来自三个MySQL表的数据组合到新表中?
    mysql:从三个表和列的新表创建新表 答案:为了实现这一目标,您可以利用一个3-way Join。 选择p。*,d.content作为年龄 来自人为p的人 加入d.person_id = p.id上的d的详细信息 加入T.Id = d.detail_id的分类法 其中t.taxonomy =...
    编程 发布于2025-04-07
  • 如何在php中使用卷发发送原始帖子请求?
    如何在php中使用卷发发送原始帖子请求?
    如何使用php 创建请求来发送原始帖子请求,开始使用curl_init()开始初始化curl session。然后,配置以下选项: curlopt_url:请求 [要发送的原始数据指定内容类型,为原始的帖子请求指定身体的内容类型很重要。在这种情况下,它是文本/平原。要执行此操作,请使用包含以下标头...
    编程 发布于2025-04-07
  • 如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    从python import codecs import codecs import codecs 导入 text = codecs.decode('这狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#带有...
    编程 发布于2025-04-07

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

Copyright© 2022 湘ICP备2022001581号-3