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

注意 Java 中的型別轉換

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

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 ...
    程式設計 發佈於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的“ .ai...
    程式設計 發佈於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