Chciałbym wiedzieć, jak zachować się instanceof
operator w Javie.
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
}
}
Dlaczego tak się dzieje? Nie ma związku między interface C
i class B
, ale daje fałsz, podczas gdy w przypadku obj instanceof A
daje błąd kompilatora?
java
class
inheritance
interface
instanceof
Ajay Sharma
źródło
źródło
Object obj = new B()
, kompiluje się.class B
jestfinal
toobj instanceof C
również nie zostanie skompilowane, ponieważ jeśli nieB
może mieć żadnych podtypów, to na pewno nie będzie związane zC
.Odpowiedzi:
Ponieważ Java nie ma dziedziczenia wielu klas, podczas kompilacji absolutnie wiadomo, że
obj
obiekt typuB
nie może być podtypemA
. Z drugiej strony może to być podtyp interfejsuC
, na przykład w tym przypadku: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 } }
Zatem patrząc tylko na
obj instanceof C
kompilator wyrażeń nie można z góry stwierdzić, czy będzie to prawda, czy fałsz, ale patrząc naobj instanceof A
niego, wiemy, że jest to zawsze fałszywe, a zatem bez znaczenia i pomaga zapobiec błędom. Jeśli nadal chcesz mieć to bezsensowne sprawdzenie w swoim programie, możesz dodać jawne rzutowanie doObject
:System.out.println(((Object)obj) instanceof A); //compiles fine
źródło
A.class.isAssignableFrom(obj.getClass())
Java has no multiple class inheritance
tak zgadzam się, ale jak to jest stosowane w tym przypadku, ponieważ ani B lub A rozciąga anyting więc dlaczego wielokrotne Dziedziczenie here.It byłoby pomocne, jeśli można to wytłumaczyć?B extends A
. W moim życiu naprawdę potrzebowałem robić takie dziwne kontrole i rzucania, jak(A)(Object)b
w czasie wykonywania, tak naprawdę było to możliwe.Użycie
final
modyfikatora w poniższej deklaracji klasy gwarantuje, że nie może istnieć podklasaTest
, która może implementować interfejsFoobar
. W takim przypadku jest oczywiste, żeTest
iFoobar
nie są ze sobą kompatybilne: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 { }
W przeciwnym razie, jeśli
Test
nie zostanie zadeklarowanefinal
, może się zdarzyć, że podklasaTest
implementuje interfejs. I dlatego kompilator dopuściłby instrukcjętest instanceof Foobar
w tym przypadku.źródło