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

Mengapa Java Menghalang Penduaan Tandatangan Kaedah Selepas Pemadaman Generik?

Linda Hamilton
Linda Hamiltonasal
2024-12-25 16:56:13903semak imbas

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) {}
}

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) {...}
}

Seterusnya, lanjutan kelas ini telah dicipta:

class Overrider extends CollectionConverter {
  List toList(Collection c) {...}
}

Dengan pengenalan generik, kelas CollectionConverter telah dikemas kini:

class CollectionConverter {
  <T> List<T> toList(Collection<T> c) {...}
}

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) {...}
}

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!

Kenyataan:
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