」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 注意 Java 中的型別轉換

注意 Java 中的型別轉換

發佈於2024-11-08
瀏覽:960

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]刪除
最新教學 更多>
  • 機器學習簡介
    機器學習簡介
    什麼是機器學習? 機器學習是電腦科學的一個領域,它使用靜態技術賦予電腦系統「學習」的能力資料,沒有 被明確編程。 這意味著,「ML 就是從資料中學習」 明確程式設計意味著,為每個場景編寫程式碼,以處理該情況。 在機器學習中,我們不是為每個場景編寫明確的程式碼,而是訓練模型從資料...
    程式設計 發佈於2024-11-08
  • 如何捕獲 JavaScript 中自訂異常的堆疊追蹤?
    如何捕獲 JavaScript 中自訂異常的堆疊追蹤?
    獲取一系列拋出的異常雖然 JavaScript 允許引發異常,但獲取自定義異常的堆疊跟踪可能具有挑戰性。本文探討了專門針對使用者定義的異常檢索堆疊追蹤的各種方法。 Error 物件的 stack 屬性提供了一個簡單的解決方案。透過建立新的 Error 物件並存取其 stack 屬性,您可以擷取追蹤:...
    程式設計 發佈於2024-11-08
  • 了解 React 中的關鍵屬性 - 常見錯誤
    了解 React 中的關鍵屬性 - 常見錯誤
    如果你喜歡我的文章,可以請我喝杯咖啡:) 在 React 中使用清單時,最關鍵的概念之一是 key 屬性。鍵在 React 如何管理清單更新方面發揮著重要作用。 React 中的鍵是什麼? 在 React 中,鍵是分配給清單中元素的唯一識別碼。這些鍵可協助 React 確定哪些項目...
    程式設計 發佈於2024-11-08
  • 掌握 React:建立強大 Web 應用程式的循序漸進之旅(簡介)
    掌握 React:建立強大 Web 應用程式的循序漸進之旅(簡介)
    React is a popular JavaScript library used to build user interfaces, especially for single-page websites or apps. Whether you're a complete beginner o...
    程式設計 發佈於2024-11-08
  • JavaScript DOM 與 BOM!
    JavaScript DOM 與 BOM!
    DOM DOM 代表文檔物件模型,代表網頁。這允許程式操縱文件結構、樣式和內容。 const listDiv = document.getElementById("list-div"); listDiv.classList.add('new-class'); listDiv.cl...
    程式設計 發佈於2024-11-08
  • 綁定和模板:Peasy-UI 系列的一部分
    綁定和模板:Peasy-UI 系列的一部分
    Table of Contents Introduction Bindings and the Template Text Bindings Basic Binding Conditional Boolean Text B...
    程式設計 發佈於2024-11-08
  • 實現介面
    實現介面
    定義介面後,一個或多個類別可以實現它。 要實作接口,請在類別定義中使用 Implements 子句。 該類別必須實作介面所需的所有方法。 包含 Implements 子句的類別的一般形式是: 類別類別名稱擴展超類別實作介面{ // 類體 } 若要實作多個接口,接口之間用逗號分隔。 ...
    程式設計 發佈於2024-11-08
  • 檢查 Effect-TS 選項中的元素:實用指南
    檢查 Effect-TS 選項中的元素:實用指南
    Effect-TS 提供了檢查 Option 是否包含特定值的方法。這些函數允許您使用自訂等價函數或預設等價來確定選項中是否存在值。在本文中,我們將探討用於檢查選項中元素的兩個關鍵函數:O.containsWith 和 O.contains. 範例 1:使用 O.containsWi...
    程式設計 發佈於2024-11-08
  • Python 物件導向程式設計簡介
    Python 物件導向程式設計簡介
    Python 编程语言 Python 是一种解释型、面向对象的编程语言。由于其高级内置数据结构和动态类型,它在快速开发新应用程序以及编写脚本代码以组合用不同语言编写的现有组件方面很受欢迎。 Python简单易学的语法强调可读性,从而降低了长期程序维护的成本和复杂性。它支持各种包含代...
    程式設計 發佈於2024-11-08
  • 最佳軟體比較中的頂級數據科學工具
    最佳軟體比較中的頂級數據科學工具
    介绍 到 2024 年,数据科学将通过使用复杂的分析、人工智能和机器学习推动决策,继续改变业务。随着对熟练数据科学家的需求不断增加,对能够加快操作、提高生产力并提供可靠见解的强大工具的需求也在增加。但是,有这么多可用的选项,目前哪种软件最适合专业人士? 这项比较研究探讨了 2024...
    程式設計 發佈於2024-11-08
  • 我如何將應用程式效能提高到
    我如何將應用程式效能提高到
    ⌛ 回顾时间 在我的上一篇博客中,我谈到了如何在短短 2 周内将应用程序大小从 75MB 减少到 34MB(查看!)。但这还不是全部,我还将我们应用程序的整体性能提高了 80%?. 让我们来看看如何!! ?传说 经过简单的一轮浏览后,我发现我们的应用程序中存在一些导...
    程式設計 發佈於2024-11-08
  • 為什麼 MySQL 會拋出「警告:mysql_fetch_assoc 參數無效」錯誤?
    為什麼 MySQL 會拋出「警告:mysql_fetch_assoc 參數無效」錯誤?
    MySQL 警告:mysql_fetch_assoc 的參數無效問題:嘗試從MySQL 檢索資料時資料庫時,遇到以下錯誤訊息:mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource解釋:The mysql...
    程式設計 發佈於2024-11-08
  • Django 查詢集可以透過模型屬性過濾嗎?
    Django 查詢集可以透過模型屬性過濾嗎?
    按模型屬性過濾 Django 查詢集Django 模型上的查詢通常使用標準過濾器根據預定義字段值選擇特定實例。但是,如果您需要根據模型中定義的自訂屬性進行過濾,該怎麼辦? 您可以透過模型屬性篩選查詢集嗎? 不幸的是,Django 的過濾器主要運行在資料庫級別,將它們轉換為 SQL 命令以有效地檢索資...
    程式設計 發佈於2024-11-08
  • 儘管配置正確,為什麼我無法在 Laravel 中發送 TLS 電子郵件?
    儘管配置正確,為什麼我無法在 Laravel 中發送 TLS 電子郵件?
    無法發送TLS 電子郵件:解決Laravel 證書驗證錯誤儘管啟用了不太安全的Gmail 設定並正確配置了Laravel 的.env 文件,您在傳送TLS 電子郵件時遇到憑證驗證失敗。錯誤訊息表示 SSL 操作失敗且無法驗證伺服器憑證。 要解決此問題,如果您的作業系統沒有自動管理受信任的憑證儲存區,...
    程式設計 發佈於2024-11-08
  • 使用 Wasmtime 和 Wasm3 將 Golang 編譯為 Wasm 時出現錯誤如何解決?
    使用 Wasmtime 和 Wasm3 將 Golang 編譯為 Wasm 時出現錯誤如何解決?
    使用Wasmtime 和Wasm3 將Golang 編譯為Wasm 時出現錯誤使用GOOS=js 將Golang 程式碼編譯為WebAssembly (WARCasm) GO =wasm go使用Wasmtime 或Wasm3 執行時,build -o main.wasm 可能會導致錯誤。讓我們調查...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3