Je voudrais connaître le comportement suivant de l' instanceof
opérateur en Java.
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
}
}
Pourquoi en est-il ainsi? Il n'y a pas de relation entre interface C
et class B
, mais cela donne false alors que dans le cas, obj instanceof A
cela donne une erreur de compilation?
java
class
inheritance
interface
instanceof
Ajay Sharma
la source
la source
Object obj = new B()
, il se compile.class B
estfinal
alorsobj instanceof C
ne compilera pas non plus, car siB
ne peut avoir aucun sous-type, alors il est garanti qu'il n'est pas lié àC
.Réponses:
Parce que Java n'a pas d'héritage de classes multiples, il est absolument connu lors de la compilation que l'
obj
objet de typeB
ne peut pas être un sous-typeA
. Par contre il peut éventuellement s'agir d'un sous-type d'interfaceC
, par exemple dans ce cas:Donc, regarder uniquement le
obj instanceof C
compilateur d'expression ne peut pas dire à l'avance s'il sera vrai ou faux, mais le regarderobj instanceof A
sait que c'est toujours faux, donc dénué de sens et vous aide à éviter une erreur. Si vous souhaitez toujours avoir cette vérification sans signification dans votre programme, vous pouvez ajouter un casting explicite auObject
:la source
A.class.isAssignableFrom(obj.getClass())
Java has no multiple class inheritance
oui je suis d'accord mais comment cela s'applique dans ce cas parce que ni B ni A ne s'étendent, alors pourquoi l'héritage multiple ici. Ce serait utile si vous pouvez expliquer?B extends A
. Dans ma vie, j'avais en fait besoin de faire des vérifications et des lancers aussi étranges,(A)(Object)b
comme au moment de l'exécution, il était en fait possible d'être vrai.En utilisant le
final
modificateur dans la déclaration de classe ci-dessous, il est garanti qu'il ne peut pas y avoir de sous-classe deTest
, qui peut implémenter l'interfaceFoobar
. Dans ce cas, il est évident queTest
etFoobar
ne sont pas compatibles les uns avec les autres:Sinon, si
Test
n'est pas déclaréfinal
, il est possible qu'une sous-classe deTest
implémente l'interface. Et c'est pourquoi le compilateur autoriserait l'instructiontest instanceof Foobar
dans ce cas.la source