首頁  >  文章  >  Java  >  注意 Java 中的型別轉換

注意 Java 中的型別轉換

王林
王林原創
2024-09-12 10:16:50744瀏覽

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<Integer> set = new TreeSet<>();
        List<Integer> list = new ArrayList<>();

        for (int i = -3; i < 3; i++) {
            set.add(i);
            list.add(i);
        }

        for (int i = 0; i < 3; i++) {
            set.remove(i);
            list.remove(i); // como corrigir: list.remove((Integer) i);
        }

        System.out.println(set + " " + list);

    }

在此程式中,目標是將 -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 類別中的移除方法選擇重載,將其轉換為 Integer。

List中的remove行為是依索引刪除,而Set中的remove是依值刪除。所有這些都是由於接收 Integer 的 remove 超載造成的。

以上是注意 Java 中的型別轉換的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn