Rumah  >  Artikel  >  Java  >  Mengapa kaedah `assertThat` gagal disusun apabila menggunakan `Map

Mengapa kaedah `assertThat` gagal disusun apabila menggunakan `Map

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-13 11:54:02162semak imbas

Why does the `assertThat` method fail to compile when using `Map

Java Generik: lwn. dalam Tandatangan Kaedah

Generik Java membolehkan anda mencipta koleksi dan kaedah selamat jenis yang boleh beroperasi pada julat jenis data. Apabila menggunakan generik, fahami perbezaan antara dan adalah penting.

Pertimbangkan contoh berikut:

Map<String, Class<? extends Serializable>> expected = null;
Map<String, Class<Date>> result = null;
assertThat(result, is(expected));

Contoh ini menghasilkan ralat kompilasi dengan mesej berikut:

Error: cannot find symbol method assertThat(java.util.Map<java.lang.String,java.lang.Class<java.util.Date>>, org.hamcrest.Matcher<java.util.Map<java.lang.String,java.lang.Class<? extends java.io.Serializable>>>)

Mengapa versi ini gagal menyusun?

Puncanya terletak pada penggunaan dalam kelas Matcher. Dalam bentuk asalnya, assertThat memerlukan Matcher yang sepadan dengan jenis T yang tepat. Walau bagaimanapun, dalam contoh kami, kami mempunyai Peta Rentetan ke Kelas, di mana kuncinya ialah jenis String dan nilainya ialah jenis Class. Memandangkan peta hasil kami mengandungi Kelas, yang manakah merupakan subjenis Kelas, pengkompil tidak dapat menjamin bahawa Matcher serasi dengan peta yang dijangkakan.

Apakah keburukan menukar assertThat to Matcher?

Menukar asertThat kepada Match membolehkan kita lulus dalam Matcher yang sepadan dengan superjenis T. Walaupun ini mungkin kelihatan seperti perubahan yang mudah, ia boleh membawa kepada tingkah laku yang tidak dijangka. Sebagai contoh, jika kita mempunyai Matcher yang sepadan dengan Senarai Rentetan, kita boleh menyerahkannya kepada kaedah yang mengharapkan Matcher untuk Senarai Objek. Dalam kes ini, Matcher tidak akan dapat memadankan parameter sebenar dengan betul, yang berpotensi membawa kepada keputusan yang salah.

Adakah gunanya untuk menjana kaedah assertThat dalam JUnit?

Penjanaan assertThat dalam JUnit bertujuan untuk memastikan keselamatan jenis dan mengelakkan ketidakpadanan antara jenis yang dijangka dan sebenar. Walau bagaimanapun, seperti yang dibincangkan di atas, ia juga boleh membawa kepada potensi isu jika tidak digunakan dengan berhati-hati.

Cadangan

Apabila membuat keputusan antara dan dalam tandatangan kaedah, adalah penting untuk mempertimbangkan perkara berikut:

  • Gunakan apabila kaedah memerlukan superjenis T untuk dihantar masuk.
  • Gunakan apabila kaedah tersebut memerlukan padanan jenis yang tepat untuk T.

Dengan mengikut pengesyoran ini, anda boleh mengelakkan ralat penyusunan dan memastikan keselamatan jenis apabila menggunakan generik Java.

Atas ialah kandungan terperinci Mengapa kaedah `assertThat` gagal disusun apabila menggunakan `Map. 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