Penukaran Jenis dalam Amalan
Gunakan penukaran jenis dalam situasi dunia sebenar, termasuk pengiraan angka dan hierarki OOP.
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 methodsPenukaran 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.3333333333333Penukaran 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.5Kaedah 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/intsentiasa 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) longValberbandinglongVal.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); // 1234567890123Semakan 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
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
- Jenis Primitif berbanding Rujukan
- Penukaran Pelebaran dan Penyempitan
- Operator instanceof
- Penukaran Jenis dalam Amalan