Saya ingin mengetahui tentang perilaku instanceof
operator berikut di Jawa.
interface C {}
class B {}
public class A {
public static void main(String args[]) {
B obj = new B();
System.out.println(obj instanceof A); //Gives compiler error
System.out.println(obj instanceof C); //Gives false as output
}
}
Kenapa gitu? Tidak ada hubungan antara interface C
dan class B
, tetapi memberikan false sedangkan jika obj instanceof A
memberikan kesalahan compiler?
java
class
inheritance
interface
instanceof
Ajay Sharma
sumber
sumber
Object obj = new B()
, itu akan dikompilasi.class B
adafinal
makaobj instanceof C
tidak akan dikompilasi juga, karena jika tidakB
dapat memiliki subtipe, maka dijamin tidak terkait denganC
.Jawaban:
Karena Java tidak memiliki pewarisan kelas jamak, selama kompilasi diketahui bahwa
obj
objek berjenisB
tidak dapat dijadikan subjenisA
. Di sisi lain, ini mungkin merupakan subtipe antarmukaC
, misalnya dalam kasus ini:interface C {} class B {} class D extends B implements C {} public class A { public static void main(String args[]) { B obj = new D(); System.out.println(obj instanceof C); //compiles and gives true as output } }
Jadi melihat hanya pada
obj instanceof C
pengompilasi ekspresi tidak dapat mengetahui sebelumnya apakah itu benar atau salah, tetapi melihatnyaobj instanceof A
tahu bahwa ini selalu salah, sehingga tidak berarti dan membantu Anda mencegah kesalahan. Jika Anda masih ingin mendapatkan tanda centang yang tidak berarti ini di program Anda, Anda dapat menambahkan transmisi eksplisit keObject
:System.out.println(((Object)obj) instanceof A); //compiles fine
sumber
A.class.isAssignableFrom(obj.getClass())
Java has no multiple class inheritance
ya Saya setuju tetapi bagaimana penerapannya dalam kasus ini karena B atau A tidak memperluas anyting jadi mengapa ada banyak pewarisan di sini. Akan sangat membantu jika Anda dapat menjelaskan?B extends A
. Dalam hidup saya, saya benar-benar perlu melakukan pemeriksaan dan pemeran aneh seperti(A)(Object)b
dalam runtime itu sebenarnya mungkin untuk menjadi kenyataan.Dengan menggunakan
final
pengubah dalam deklarasi kelas di bawah ini, dijamin bahwa tidak mungkin ada subkelas dariTest
, yang mungkin mengimplementasikan antarmukaFoobar
. Dalam hal ini, jelas bahwaTest
danFoobar
tidak kompatibel satu sama lain:public final class Test { public static void main(String[] args) { Test test = new Test(); System.out.println(test instanceof Foobar); // Compiler error: incompatible types } } interface Foobar { }
Jika tidak, jika
Test
tidak dideklarasikanfinal
, mungkin saja subclass dariTest
mengimplementasikan antarmuka. Dan itulah mengapa kompilator akan mengizinkan pernyataantest instanceof Foobar
dalam kasus ini.sumber