Java Operatorof

1. Pengenalan

Dalam tutorial ini cepat, kita akan belajar tentang instanceof operator di Jawa.

2. Apakah contoh Operator?

instanceof adalah pengendali binari yang digunakan untuk menguji apakah objek dari jenis tertentu. Hasil operasi itu benar atau salah . Ia juga dikenali sebagai operator perbandingan jenis kerana membandingkan contoh dengan jenis.

Sebelum membuang objek yang tidak diketahui, contoh pemeriksaan harus selalu digunakan. Melakukan ini membantu mengelakkan ClassCastException pada waktu berjalan.

The instanceof sintaks asas pengendali ialah:

(object) instanceof (type)

Mari lihat contoh asas untuk operator contoh . Pertama, mari buat pusingan kelas :

public class Round { // implementation details }

Seterusnya, mari buat cincin kelas yang memanjang Pusingan :

public class Ring extends Round { // implementation details }

Kita boleh menggunakan instanceof untuk memeriksa jika suatu unsur Ring adalah balik jenis:

@Test public void givenWhenInstanceIsCorrect_thenReturnTrue() { Ring ring = new Ring(); Assert.assertTrue(ring instanceof Round); }

3. Bagaimana Adakah instanceof Operator Kerja?

The instanceof operator berfungsi pada prinsip adalah-a hubungan . Konsep hubungan adalah berdasarkan warisan kelas atau pelaksanaan antara muka.

Untuk menunjukkan ini, mari kita buat antara muka Shape :

public interface Shape { // implementation details }

Mari juga buat Circle kelas yang menerapkan antara muka Shape dan juga memperluas kelas Round :

public class Circle extends Round implements Shape { // implementation details }

The instanceof hasil akan menjadi benar jika objek itu adalah contoh jenis:

@Test public void givenWhenObjectIsInstanceOfType_thenReturnTrue() { Circle circle = new Circle(); Assert.assertTrue(circle instanceof Circle); }

Ia juga akan berlaku jika objek tersebut merupakan contoh subkelas dari jenis:

@Test public void giveWhenInstanceIsOfSubtype_thenReturnTrue() { Circle circle = new Circle(); Assert.assertTrue(circle instanceof Round); }

Sekiranya jenisnya adalah antara muka, ia akan kembali benar jika objek tersebut menggunakan antara muka:

@Test public void givenWhenTypeIsInterface_thenReturnTrue() { Circle circle = new Circle(); Assert.assertTrue(circle instanceof Shape); }

Operator instance tidak dapat digunakan jika tidak ada hubungan antara objek yang sedang dibandingkan dan jenis yang dibandingkan dengannya.

Mari buat Segitiga kelas baru yang menerapkan Shape tetapi tidak mempunyai hubungan dengan Circle :

public class Triangle implements Shape { // implementation details }

Sekarang, jika kita menggunakan instanceof untuk memeriksa apakah Circle adalah contoh Segitiga :

@Test public void givenWhenComparingClassInDiffHierarchy_thenCompilationError() { Circle circle = new Circle(); Assert.assertFalse(circle instanceof Triangle); }

Kami akan mendapat ralat kompilasi kerana tidak ada hubungan antara kelas Lingkaran dan Segitiga :

java.lang.Error: Unresolved compilation problem: Incompatible conditional operand types Circle and Triangle

4. Menggunakan instanceof dengan Jenis Objek

Di Jawa, setiap kelas secara tidak langsung mewarisi dari kelas Objek . Oleh itu, menggunakan contoh operator dengan jenis Objek akan sentiasa dinilai menjadi benar :

@Test public void givenWhenTypeIsOfObjectType_thenReturnTrue() { Thread thread = new Thread(); Assert.assertTrue(thread instanceof Object); }

5. Menggunakan instanceof Operator apabila suatu objek null

Sekiranya kita menggunakan operator instance pada objek yang kosong , ia akan kembali palsu . Juga, tidak ada pemeriksaan null diperlukan apabila menggunakan instanceof operator.

@Test public void givenWhenInstanceValueIsNull_thenReturnFalse() { Circle circle = null; Assert.assertFalse(circle instanceof Round); }

6. contoh dan Generik

Ujian dan pemeran contoh bergantung pada pemeriksaan maklumat jenis pada waktu runtime. Oleh itu, kami tidak dapat menggunakan instanceof bersama dengan jenis generik yang terhapus .

Sebagai contoh, jika kita cuba menyusun coretan berikut:

public static  void sort(List collection) { if (collection instanceof List) { // sort strings differently } // omitted }

Kemudian kami mendapat ralat kompilasi ini:

error: illegal generic type for instanceof if (collection instanceof List) { ^

Secara teknikalnya, kami hanya dibenarkan menggunakan contoh dan disahkan semulajenis di Jawa. Jenis dikemas kini sekiranya maklumat jenisnya ada pada waktu runtime.

Jenis yang disatukan di Jawa adalah seperti berikut:

  • Jenis primitif seperti int
  • Kelas dan antara muka bukan generik seperti String atau Random
  • Jenis generik di mana semua jenis adalah wildcard tanpa had seperti Set atau Peta
  • Jenis mentah seperti List atau HashMap
  • Susunan jenis lain yang boleh disahkan seperti String [], List [], atau Map []

Oleh kerana parameter jenis generik tidak dikemas kini, kami juga tidak dapat menggunakannya:

public static  boolean isOfType(Object input) { return input instanceof T; // won't compile }

Walau bagaimanapun, ada kemungkinan untuk menguji sesuatu seperti Senarai :

if (collection instanceof List) { // do something }

7. Kesimpulannya

Dalam tutorial ini, kami telah mengetahui tentang contoh operator dan cara menggunakannya. Contoh kod lengkap boleh didapati di GitHub.