Aturan ini dimaksudkan untuk menghindari konflik dalam kode lawas yang masih menggunakan tipe mentah.
Berikut ilustrasi mengapa ini tidak diizinkan, diambil dari JLS. Misalkan, sebelum obat generik diperkenalkan ke Java, saya menulis beberapa kode seperti ini:
class CollectionConverter {
List toList(Collection c) {...}
}
Anda memperpanjang kelas saya, seperti ini:
class Overrider extends CollectionConverter{
List toList(Collection c) {...}
}
Setelah pengenalan obat generik, saya memutuskan untuk memperbarui perpustakaan saya.
class CollectionConverter {
<T> List<T> toList(Collection<T> c) {...}
}
Anda tidak siap untuk membuat pembaruan apa pun, sehingga Anda meninggalkan Overrider
kelas Anda sendirian. Untuk mengganti toList()
metode ini dengan benar , perancang bahasa memutuskan bahwa jenis mentah "override-equivalen" untuk semua jenis yang dibuat. Ini berarti bahwa meskipun tanda tangan metode Anda tidak lagi secara resmi sama dengan tanda tangan superclass saya, metode Anda masih menimpanya.
Sekarang, waktu berlalu dan Anda memutuskan siap memperbarui kelas Anda. Tetapi Anda sedikit mengacaukan, dan alih-alih mengedit toList()
metode mentah yang ada, Anda menambahkan metode baru seperti ini:
class Overrider extends CollectionConverter {
@Override
List toList(Collection c) {...}
@Override
<T> List<T> toList(Collection<T> c) {...}
}
Karena mengesampingkan ekuivalensi jenis mentah, kedua metode berada dalam bentuk yang valid untuk mengganti toList(Collection<T>)
metode. Tetapi tentu saja, kompiler perlu menyelesaikan satu metode. Untuk menghilangkan ambiguitas ini, kelas tidak diperbolehkan memiliki beberapa metode yang override-equivalen — yaitu, beberapa metode dengan tipe parameter yang sama setelah penghapusan.
Kuncinya adalah bahwa ini adalah aturan bahasa yang dirancang untuk menjaga kompatibilitas dengan kode lama menggunakan tipe mentah. Ini bukan batasan yang diperlukan oleh penghapusan parameter tipe; karena resolusi metode terjadi pada waktu kompilasi, menambahkan tipe generik ke pengidentifikasi metode sudah cukup.