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

注意 Java 中的型別轉換

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

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]刪除
最新教學 更多>
  • 用戶本地時間格式及時區偏移顯示指南
    用戶本地時間格式及時區偏移顯示指南
    在用戶的語言環境格式中顯示日期/時間,並使用時間偏移在向最終用戶展示日期和時間時,以其localzone and格式顯示它們至關重要。這確保了不同地理位置的清晰度和無縫用戶體驗。以下是使用JavaScript實現此目的的方法。 方法:推薦方法是處理客戶端的Javascript中的日期/時間格式化和...
    程式設計 發佈於2025-07-12
  • 在GO中構造SQL查詢時,如何安全地加入文本和值?
    在GO中構造SQL查詢時,如何安全地加入文本和值?
    在go中構造文本sql查詢時,在go sql queries 中,在使用conting and contement和contement consem per時,尤其是在使用integer per當per當per時,per per per當per. 在GO中實現這一目標的慣用方法是使用fmt.spr...
    程式設計 發佈於2025-07-12
  • 如何避免Go語言切片時的內存洩漏?
    如何避免Go語言切片時的內存洩漏?
    ,a [j:] ...雖然通常有效,但如果使用指針,可能會導致內存洩漏。這是因為原始的備份陣列保持完整,這意味著新切片外部指針引用的任何對象仍然可能佔據內存。 copy(a [i:] 對於k,n:= len(a)-j i,len(a); k
    程式設計 發佈於2025-07-12
  • 如何干淨地刪除匿名JavaScript事件處理程序?
    如何干淨地刪除匿名JavaScript事件處理程序?
    刪除匿名事件偵聽器將匿名事件偵聽器添加到元素中會提供靈活性和簡單性,但是當要刪除它們時,可以構成挑戰,而無需替換元素本身就可以替換一個問題。 element? element.addeventlistener(event,function(){/在這里工作/},false); 要解決此問題,請考...
    程式設計 發佈於2025-07-12
  • 如何在GO編譯器中自定義編譯優化?
    如何在GO編譯器中自定義編譯優化?
    在GO編譯器中自定義編譯優化 GO中的默認編譯過程遵循特定的優化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    程式設計 發佈於2025-07-12
  • 為什麼不使用CSS`content'屬性顯示圖像?
    為什麼不使用CSS`content'屬性顯示圖像?
    在Firefox extemers屬性為某些圖像很大,&& && && &&華倍華倍[華氏華倍華氏度]很少見,卻是某些瀏覽屬性很少,尤其是特定於Firefox的某些瀏覽器未能在使用內容屬性引用時未能顯示圖像的情況。這可以在提供的CSS類中看到:。 googlepic { 內容:url(&...
    程式設計 發佈於2025-07-12
  • 圖片在Chrome中為何仍有邊框? `border: none;`無效解決方案
    圖片在Chrome中為何仍有邊框? `border: none;`無效解決方案
    在chrome 中刪除一個頻繁的問題時,在與Chrome and IE9中的圖像一起工作時,遇到了一個頻繁的問題。和“邊境:無;”在CSS中。要解決此問題,請考慮以下方法: Chrome具有忽略“ border:none; none;”的已知錯誤,風格。要解決此問題,請使用以下CSS ID塊創建帶...
    程式設計 發佈於2025-07-12
  • 在Java中使用for-to-loop和迭代器進行收集遍歷之間是否存在性能差異?
    在Java中使用for-to-loop和迭代器進行收集遍歷之間是否存在性能差異?
    For Each Loop vs. Iterator: Efficiency in Collection TraversalIntroductionWhen traversing a collection in Java, the choice arises between using a for-...
    程式設計 發佈於2025-07-12
  • 如何使用PHP從XML文件中有效地檢索屬性值?
    如何使用PHP從XML文件中有效地檢索屬性值?
    從php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    程式設計 發佈於2025-07-12
  • 如何從PHP中的數組中提取隨機元素?
    如何從PHP中的數組中提取隨機元素?
    從陣列中的隨機選擇,可以輕鬆從數組中獲取隨機項目。考慮以下數組:; 從此數組中檢索一個隨機項目,利用array_rand( array_rand()函數從數組返回一個隨機鍵。通過將$項目數組索引使用此鍵,我們可以從數組中訪問一個隨機元素。這種方法為選擇隨機項目提供了一種直接且可靠的方法。
    程式設計 發佈於2025-07-12
  • Go語言垃圾回收如何處理切片內存?
    Go語言垃圾回收如何處理切片內存?
    Garbage Collection in Go Slices: A Detailed AnalysisIn Go, a slice is a dynamic array that references an underlying array.使用切片時,了解垃圾收集行為至關重要,以避免潛在的內存洩...
    程式設計 發佈於2025-07-12
  • 您如何在Laravel Blade模板中定義變量?
    您如何在Laravel Blade模板中定義變量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配變量對於存儲以後使用的數據至關重要。在使用“ {{}}”分配變量的同時,它可能並不總是最優雅的解決方案。 幸運的是,Blade通過@php Directive提供了更優雅的方法: $ old_section =...
    程式設計 發佈於2025-07-12
  • Java中如何使用觀察者模式實現自定義事件?
    Java中如何使用觀察者模式實現自定義事件?
    在Java 中創建自定義事件的自定義事件在許多編程場景中都是無關緊要的,使組件能夠基於特定的觸發器相互通信。本文旨在解決以下內容:問題語句我們如何在Java中實現自定義事件以促進基於特定事件的對象之間的交互,定義了管理訂閱者的類界面。 以下代碼片段演示瞭如何使用觀察者模式創建自定義事件: args...
    程式設計 發佈於2025-07-12
  • 在程序退出之前,我需要在C ++中明確刪除堆的堆分配嗎?
    在程序退出之前,我需要在C ++中明確刪除堆的堆分配嗎?
    在C中的顯式刪除 在C中的動態內存分配時,開發人員通常會想知道是否有必要在heap-procal extrable exit exit上進行手動調用“ delete”操作員,但開發人員通常會想知道是否需要手動調用“ delete”操作員。本文深入研究了這個主題。 在C主函數中,使用了動態分配變量(...
    程式設計 發佈於2025-07-12
  • 如何克服PHP的功能重新定義限制?
    如何克服PHP的功能重新定義限制?
    克服PHP的函數重新定義限制在PHP中,多次定義一個相同名稱的函數是一個no-no。嘗試這樣做,如提供的代碼段所示,將導致可怕的“不能重新列出”錯誤。 但是,PHP工具腰帶中有一個隱藏的寶石:runkit擴展。它使您能夠靈活地重新定義函數。 runkit_function_renction_...
    程式設計 發佈於2025-07-12

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

Copyright© 2022 湘ICP备2022001581号-3