Saya membaca tentang metode umum dari OracleDocGenericMethod . Saya cukup bingung tentang perbandingannya ketika dikatakan kapan harus menggunakan wild-card dan kapan harus menggunakan metode umum. Mengutip dari dokumen.
interface Collection<E> { public boolean containsAll(Collection<?> c); public boolean addAll(Collection<? extends E> c); }
Kami dapat menggunakan metode umum di sini sebagai gantinya:
interface Collection<E> { public <T> boolean containsAll(Collection<T> c); public <T extends E> boolean addAll(Collection<T> c); // Hey, type variables can have bounds too! }
[…] Ini memberitahu kita bahwa argumen type digunakan untuk polimorfisme; efek satu-satunya adalah mengizinkan berbagai jenis argumen aktual untuk digunakan di situs pemanggilan yang berbeda. Jika demikian, gunakan karakter pengganti. Karakter pengganti dirancang untuk mendukung subtipe fleksibel, yang kami coba ungkapkan di sini.
Bukankah menurut kami wild card (Collection<? extends E> c);
juga mendukung jenis polimorfisme? Lalu mengapa penggunaan metode generik dianggap kurang baik dalam hal ini?
Melanjutkan ke depan, itu menyatakan,
Metode generik memungkinkan parameter tipe digunakan untuk mengekspresikan ketergantungan di antara tipe satu atau lebih argumen ke metode dan / atau tipe kembaliannya. Jika tidak ada ketergantungan seperti itu, metode umum tidak boleh digunakan.
Apa artinya ini?
Mereka telah mempresentasikan contohnya
class Collections { public static <T> void copy(List<T> dest, List<? extends T> src) { ... }
[…]
Kita bisa saja menulis tanda tangan untuk metode ini dengan cara lain, tanpa menggunakan wildcard sama sekali:
class Collections { public static <T, S extends T> void copy(List<T> dest, List<S> src) { ... }
Dokumen tersebut mencegah deklarasi kedua dan mempromosikan penggunaan sintaks pertama? Apa perbedaan antara deklarasi pertama dan kedua? Keduanya sepertinya melakukan hal yang sama?
Adakah yang bisa menjelaskan area ini.
?
sama sekali. Anda dapat menulis ulang sebagai `public static <T1 extends Number, T2 extends Number> void copy (List <T1> dest, List <T2> src) dan dalam hal ini menjadi jelas apa yang sedang terjadi.