Kalau saya kasih tahu secara langsung apa itu obat generik, saya sungguh tidak bisa. Ini pertanyaannya:
Tentukan kelas titik koordinat yang dapat menyimpan berbagai tipe data, seperti bilangan bulat, tipe titik mengambang, dan tipe string.
Karena tipe variabel tidak pasti pada awalnya, mudah untuk berpikir untuk menggunakan kelas induk dari semua tipe, yaitu kelas Object.
Tidak ada lagi omong kosong, gunakan kode untuk mencerminkannya
Contoh 1: Gunakan Object untuk mengimplementasikan input tipe data yang tidak pasti
//Gunakan Object untuk mewakili tipe yang tidak pasti
Titik publik(Objek x, Objek y) {
ini.setX(x);
ini.setY(y);
}
public void setX(Objek x) {
ini.x = x;
}
Objek publik getX() {
kembalikan x;
}
public void setY(Objek y) {
ini.y = y;
}
Objek publik getY() {
kembali kamu;
}
}
//kelas ujian
Demo kelas publik {
public static void main(String[] args) {
System.out.println("Gunakan bilangan floating point untuk menyatakan koordinat: ");
Poin p = Poin baru(12.23,23.21);
//Di sini, kelas Object diubah menjadi kelas Double, dan kemudian secara otomatis dibuka kotaknya.
System.out.println("Koordinat X" + (Ganda)p.getX());
System.out.println("Koordinat Y" + (Ganda)p.getY());
Sistem.keluar.println();
System.out.println("Gunakan bilangan bulat untuk menyatakan koordinat: ");
Poin p2 = Poin baru(12, 23);
System.out.println("Koordinat X" + (Bilangan Bulat)p2.getX());
System.out.println("Koordinat Y" + (Bilangan Bulat)p2.getY());
Sistem.keluar.println();
System.out.println("Mewakili koordinat sebagai string: ");
Titik p3 = new Point("29 derajat lintang utara", "113 derajat bujur timur");
System.out.println("Koordinat X" + (String)p3.getX());
System.out.println("Koordinat Y" + (String)p3.getY());
}
}
Anda harus memahami dengan jelas tipe apa yang Anda berikan, dan kemudian membuangnya sebelum Anda dapat menggunakannya.
Meski memenuhi permintaan, namun juga menyiratkan faktor tidak aman. Mengapa dikatakan implisit?
Misalnya, kita menggunakan new Point(12.23, "29 derajat lintang utara") untuk membuat objek Point
Lalu gunakan (Ganda) untuk mengubahnya ke bawah.
Ya, kompilasi akan lolos, tetapi setelah dijalankan, pengecualian konversi tipe akan terjadi
Menghindari pengecualian konversi kelas juga sangat mudah. Cukup ganti deklarasi Objek dengan deklarasi tipe tetap (seperti: String x, String y), sehingga kesalahan akan dilaporkan selama kompilasi.
Kemudian Anda dapat menemukan kesalahannya dan melakukan koreksi
Tapi kemudian kita tidak akan bisa memenuhi permintaan tersebut.
Untuk menghindari risiko keamanan dan mengganti berbagai tipe data, orang-orang berbakat tersebut memperkenalkan konsep generik di JDK1.5
Mari kita lihat cara menulis ulang kode di atas menggunakan obat generik
Contoh 2: Kelas generik
Demo kelas publik {
public static void main(String[] args) {
System.out.println("Gunakan bilangan floating point untuk menyatakan koordinat: ");
//Setelah menulis ulang dengan obat generik, tidak perlu melakukan transformasi ke bawah pada data yang digunakan.
Poin<Ganda> p = Poin baru<Ganda>(12.23,23.21);
System.out.println("Koordinat X" + p.getX());
System.out.println("Koordinat Y" + p.getY());
Sistem.keluar.println();
System.out.println("Gunakan bilangan bulat untuk menyatakan koordinat: ");
Titik<Bilangan Bulat> p2 = Titik<Bilangan Bulat>(12, 23);
System.out.println("Koordinat X" + p2.getX());
System.out.println("Koordinat Y" + p2.getY());
Sistem.keluar.println();
System.out.println("Mewakili koordinat sebagai string: ");
Point<String> p3 = new Point<String>("29 derajat lintang utara", "113 derajat bujur timur");
System.out.println("Koordinat X" + p3.getX());
System.out.println("Koordinat Y" + p3.getY());
}
}
Jika kami sengaja memasukkan tipe data yang berbeda saat ini:
Titik<Double> p = new Point<Double>("29 derajat lintang utara",12.22);
Kemudian, kesalahan akan dilaporkan selama kompilasi
Meskipun generik didefinisikan, jika Anda tidak menggunakan mekanisme generik di konstruktor, data akan diperlakukan sebagai Objek.
Tujuannya terutama agar kompatibel dengan kode lama sebelum JDK1.4, seperti
Poin p = Poin baru(22.11,23.21);
Hasil akhir yang berjalan sama, tetapi pesan peringatan akan muncul saat kompilasi.
Contoh 3: Metode umum
Seperti yang Anda lihat dari contoh di atas, setelah tipe objek ditentukan di konstruktor, tipe yang sama akan digunakan di seluruh kelas
Contoh paling umum digunakan dalam kerangka koleksi, seperti: ArrayList<Integer> al = new ArrayList<Integer>();
Saat ini, semua tipe objek yang dioperasikan di al adalah Integer.
Namun, terkadang kita tidak ingin membenahi objek operasinya, melainkan ingin menggunakan teknologi generik dengan lebih fleksibel.
Saat ini, Anda bisa mencoba cara generik
publik <E> batal tampilkan(E e) {
Sistem.keluar.println(e);
}
}
Demo kelas publik {
public static void main(String[] args) {
Cetak p = cetak baru();
p.cetak(12);
p.print("halo");
p.show(Bilangan Bulat baru(33));
hal.tampilkan(23);
}
}
Faktanya, dengan cara ini, tidak ada perbedaan besar dengan menggunakan objek Object dalam metode.
Terlebih lagi, setelah JDK1.5, fungsi unboxing otomatis ditambahkan, menghilangkan kebutuhan akan transformasi ke bawah.
Contoh 4: Antarmuka umum
//Metode implementasi satu:
kelas InterDemo1 mengimplementasikan Inter<String> {
cetakan kekosongan publik(String t) {
System.out.println("cetak: " + t);
}
}
//Metode implementasi kedua:
kelas InterDemo2<T> mengimplementasikan Inter<T> {
cetakan kekosongan publik(T t) {
System.out.println("cetak: " + t);
}
}
demo kelas {
public static void main(String[] args) {
InterDemo1 id1 = InterDemo1();
id1.print("halo");
InterDemo2<Bilangan Bulat> id2 = InterDemo2 baru<Bilangan Bulat>();
id2.print(Bilangan Bulat baru(23));
}
}
Ada dua cara untuk mengimplementasikan antarmuka generik. Salah satunya adalah dengan menentukan tipe generik saat mengimplementasikannya.
Cara lainnya adalah dengan tetap menggunakan obat generik dan menentukan tipe generik selama konstruksi.