Rumah > Java > javaTutorial > Mengapa Java Menghalang Penduaan Tandatangan Kaedah Selepas Pemadaman Generik?

Mengapa Java Menghalang Penduaan Tandatangan Kaedah Selepas Pemadaman Generik?

Linda Hamilton
Lepaskan: 2024-12-25 16:56:13
asal
947 orang telah melayarinya

Why Does Java Prevent Method Signature Duplication After Generic Erasure?

Penduaan Tandatangan Kaedah dan Pemadaman Generik

Di Java, tidak dibenarkan mengisytiharkan dua kaedah dalam kelas yang sama yang mempunyai pemadaman yang sama selepas menggunakan pemadaman jenis pada jenis generiknya. Sekatan ini timbul daripada potensi konflik dengan kod warisan yang menggunakan jenis mentah.

Pertimbangkan contoh berikut:

class Test {
   void add(Set<Integer> ii) {}
   void add(Set<String> ss) {}
}
Salin selepas log masuk

Kod ini akan mencetuskan ralat kompilasi: "Kaedah tambah(Set) mempunyai pemadaman tambah(Set) yang sama seperti kaedah lain dalam jenis Ujian."

Untuk memahami rasional di sebalik ini sekatan, mari kita jejak evolusi pangkalan kod hipotesis:

Pada mulanya, sebelum generik diperkenalkan di Java, kod berikut mungkin telah ditulis:

class CollectionConverter {
  List toList(Collection c) {...}
}
Salin selepas log masuk

Seterusnya, lanjutan kelas ini telah dicipta:

class Overrider extends CollectionConverter {
  List toList(Collection c) {...}
}
Salin selepas log masuk

Dengan pengenalan generik, kelas CollectionConverter telah dikemas kini:

class CollectionConverter {
  <T> List<T> toList(Collection<T> c) {...}
}
Salin selepas log masuk

Walau bagaimanapun, kelas Overrider dibiarkan tidak berubah. Untuk terus mengatasi kaedah toList() dengan betul, telah diputuskan bahawa jenis mentah adalah "override-equivalent" kepada jenis yang dijana.

Kemudian, pembangun Overrider cuba mengemas kini kelas tetapi menambah kaedah baharu bersama kaedah mentah toList() sedia ada:

class Overrider extends CollectionConverter {
  @Override
  List toList(Collection c) {...}
  @Override
  <T> List<T> toList(Collection<T> c) {...}
}
Salin selepas log masuk

Disebabkan kesetaraan penggantian jenis mentah, kedua-dua kaedah berpotensi mengatasi kaedah toList(Collection). Walau bagaimanapun, kekaburan ini perlu diselesaikan untuk pengkompil.

Untuk mengelakkan konflik sedemikian, bahasa Java mengehadkan kewujudan berbilang kaedah dengan pemadaman yang sama dalam satu kelas. Ini memastikan bahawa pembangun boleh mengatasi kaedah dengan yakin tanpa memperkenalkan kekaburan yang disebabkan oleh kod warisan yang menggunakan jenis mentah.

Atas ialah kandungan terperinci Mengapa Java Menghalang Penduaan Tandatangan Kaedah Selepas Pemadaman Generik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan