Java Academy · Pelajaran

Penukaran Jenis dalam Amalan

Gunakan penukaran jenis dalam situasi dunia sebenar, termasuk pengiraan angka dan hierarki OOP.

Pelajaran 4 daripada 413 langkah

Penukaran Jenis dalam Amalan ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Java Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Penukaran Jenis dalam Amalan

Penukaran jenis digunakan dalam pelbagai kod Java sebenar: pengiraan berangka, hierarki OOP, koleksi generik dan API lama. Pelajaran ini merangkumi corak praktikal serta perangkap yang perlu dielakkan.

Penukaran kepada Jenis Induk: Polimorfisme

Penukaran kepada jenis induk menukar subjenis kepada jenis induk. Ia sentiasa selamat dan berlaku secara tersirat — tiada operator penukaran jenis diperlukan. Ini membolehkan polimorfisme.

class Payment {}
class CreditCardPayment extends Payment {
    public void authorizeCard() {}
}

CreditCardPayment cc = new CreditCardPayment();
Payment p = cc; // implicit upcast — always safe

// p.authorizeCard(); // Compile error — Payment doesn't have this method
// need downcast to access subclass methods

Penukaran kepada Subjenis: Mengakses Ahli Subjenis

Penukaran kepada subjenis menukar rujukan jenis induk kembali kepada subjenis asal. Ia memerlukan penukaran jenis secara eksplisit dan mencetuskan ClassCastException jika objek itu sebenarnya bukan subjenis tersebut.

Payment p = new CreditCardPayment();

// Downcast to access CreditCardPayment-specific method
if (p instanceof CreditCardPayment cc) {
    cc.authorizeCard(); // safe with pattern matching
    System.out.println("Card authorized");
}

// Unsafe downcast without check:
try {
    BankTransfer bt = (BankTransfer) p; // ClassCastException!
} catch (ClassCastException e) {
    System.out.println("Wrong type!");
}

Penukaran Berangka dalam Pengiraan

Pembahagian integer akan dipenggal. Lakukan penukaran kepada double sebelum pembahagian untuk mendapatkan hasil yang tepat. Ini ialah salah satu pepijat aritmetik yang paling biasa dalam Java.

int totalRevenue = 1000;
int months = 3;

// Integer division — truncates!
double wrong = totalRevenue / months;
System.out.println(wrong); // 333.0 (not 333.33)

// Correct: cast one operand to double first
double correct = (double) totalRevenue / months;
System.out.println(correct); // 333.3333333333333

Penukaran Jenis dalam Koleksi (Sebelum Generik)

Kod legasi sering menyimpan objek dalam koleksi mentah. Penukaran kepada subjenis diperlukan untuk mendapatkan nilai bertip — sentiasa buat semakan dengan instanceof terlebih dahulu.

import java.util.*;

// Legacy raw list (pre-Java 5 style)
List legacyList = new ArrayList();
legacyList.add("Alice");
legacyList.add(42);

for (Object item : legacyList) {
    if (item instanceof String s) {
        System.out.println("Name: " + s.toUpperCase());
    } else if (item instanceof Integer n) {
        System.out.println("Score: " + (n * 2));
    }
}

Penukaran Jenis dengan Antara Muka

Objek boleh ditukar kepada mana-mana antara muka yang dilaksanakannya, lalu membolehkan anda menggunakannya dalam konteks yang memerlukan antara muka tersebut.

interface Printable { void print(); }
interface Saveable  { void save(); }

class Report implements Printable, Saveable {
    public void print() { System.out.println("Printing report"); }
    public void save()  { System.out.println("Saving report"); }
}

Object obj = new Report();

if (obj instanceof Printable p) p.print();
if (obj instanceof Saveable s) s.save();

Penukaran Jenis dengan Tatasusunan

Jenis tatasusunan membentuk hierarki tersendiri. String[] ialah subjenis bagi Object[]. Penukaran tatasusunan mengikut peraturan yang sama seperti objek.

String[] names = {"Alice", "Bob"};
Object[] objs = names;   // upcast — implicit

objs[0] = "Charlie";     // OK — still a String

try {
    objs[0] = 42;          // ArrayStoreException at runtime!
} catch (ArrayStoreException e) {
    System.out.println("Cannot store Integer in String[]");
}

// Downcast back
String[] restored = (String[]) objs;

Contoh E-Dagang: Penghalaan Payment

Contoh situasi sebenar: menghalakan pemproses pembayaran yang betul berdasarkan jenis Payment semasa pelaksanaan.

interface Payment { double amount(); }
record CreditCard(String last4, double amount) implements Payment {}
record CryptoPayment(String wallet, double amount) implements Payment {}
record BankWire(String iban, double amount) implements Payment {}

static void process(Payment p) {
    switch (p) {
        case CreditCard cc     -> System.out.println("Charging card *" + cc.last4());
        case CryptoPayment cp  -> System.out.println("Sending to wallet " + cp.wallet());
        case BankWire bw       -> System.out.println("Wiring to IBAN " + bw.iban());
    }
}

process(new CreditCard("4242", 99.99));
process(new CryptoPayment("0xABCD", 0.05));

Penukaran kepada Number untuk Matematik Generik

Superclass Number membolehkan anda melakukan operasi berangka generik pada mana-mana jenis nombor dengan menaikkan jenis kepada Number dan memanggil doubleValue().

import java.util.List;

List<Number> numbers = List.of(1, 2.5, 3L, 4.0f);

double sum = 0;
for (Number n : numbers) {
    sum += n.doubleValue(); // works for int, double, long, float
}
System.out.printf("Sum: %.1f%n", sum); // 10.5

Kaedah Utiliti untuk Penukaran Jenis Selamat

Kaedah utiliti boleh guna semula yang mengembalikan Optional kosong dan bukannya mencetuskan pengecualian apabila penukaran jenis gagal — sesuai untuk kod berasaskan saluran paip.

import java.util.Optional;

public static <T> Optional<T> safeCast(Object obj, Class<T> clazz) {
    return clazz.isInstance(obj)
        ? Optional.of(clazz.cast(obj))
        : Optional.empty();
}

// Usage
Object val = "hello";
safeCast(val, String.class)
    .ifPresent(s -> System.out.println(s.toUpperCase())); // HELLO

safeCast(val, Integer.class)
    .ifPresentOrElse(
        n -> System.out.println(n),
        () -> System.out.println("Not an Integer") // prints this
    );

Kesilapan Biasa yang Perlu Dielakkan

Berhati-hati terhadap kesilapan penukaran jenis yang biasa berikut:

  • Terlepas melakukan penukaran jenis sebelum pembahagian: int/int sentiasa menghasilkan integer
  • Melakukan penukaran kepada subjenis tanpa semakan instanceof → ClassCastException
  • Mengelirukan penukaran kepada jenis induk (selamat) dengan penukaran kepada subjenis (berisiko)
  • Mencampuradukkan jenis pembungkus: (int) longVal berbanding longVal.intValue()
// Mistake 1: integer division
double avg = 7 / 2;            // 3.0 — WRONG
double fixed = 7.0 / 2;        // 3.5 — correct

// Mistake 2: unwrapping Long as int
Long bigId = 1234567890123L;
// int id = (int) bigId;  // compiles but truncates!
long id = bigId;           // correct

System.out.println(avg);   // 3.0
System.out.println(fixed); // 3.5
System.out.println(id);    // 1234567890123

Semakan Pantas

Apakah output kod ini?

int a = 7;
int b = 2;
double result = (double) a / b;
System.out.println(result);

Imbas Kembali: Penukaran Jenis dalam Amalan

Kesimpulan utama:

  • Penukaran kepada jenis induk (subjenis → jenis induk) berlaku secara tersirat dan sentiasa selamat
  • Penukaran kepada subjenis (jenis induk → subjenis) memerlukan penukaran jenis secara eksplisit; gunakan instanceof terlebih dahulu
  • Padanan corak instanceof menggabungkan semakan dan penukaran jenis dalam satu ungkapan
  • Tukar pengangka kepada double sebelum pembahagian untuk mengelakkan pemenggalan integer
  • Gunakan padanan corak switch untuk penghalaan berdasarkan jenis yang kemas
  • Bina utiliti safeCast untuk berfungsi dengan Optional dan bukannya pengecualian
Percuma untuk bermula

Pelajari Java dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
104
Pelajaran
374

Soalan Lazim

Adakah pelajaran “Penukaran Jenis dalam Amalan” percuma?

Ya — teks penuh “Penukaran Jenis dalam Amalan” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Java Academy, tingkat taraf kepada CoddyKit PRO. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Penukaran Jenis dalam Amalan”?

Gunakan penukaran jenis dalam situasi dunia sebenar, termasuk pengiraan angka dan hierarki OOP. Anda berlatih Java Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Java Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Java Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Penukaran Jenis dalam Amalan” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Jenis Primitif berbanding Rujukan
  2. Penukaran Pelebaran dan Penyempitan
  3. Operator instanceof
  4. Penukaran Jenis dalam Amalan
← Kembali ke Java Academy