Class.isInstance versus Class.isAssignableFrom

1. Inleiding

In deze korte tutorial gaan we kijken naar het verschil tussen Class.isInstance en Class.isAssignableFrom. We zullen leren hoe we elke methode kunnen gebruiken en wat de verschillen tussen beide zijn.

2. Installatie

Laten we een interface en een paar klassen opzetten om te gebruiken terwijl we het Class.isInstance en Class.isAssignableFrom functionaliteit.

Laten we eerst een interface definiëren:

openbare interface Shape {}

Laten we vervolgens een klasse definiëren die implementeert Vorm:

openbare klasse Triangle implementeert Shape {}

Nu gaan we een klasse maken die zich uitbreidt Driehoek:

openbare klasse Gelijkbenige Driehoek verlengt Driehoek {}

3. Class.isInstance

De isInstance methode op de Klasse klasse is gelijk aan de instantie van operator. De isInstance methode is geïntroduceerd in Java 1.1 omdat het dynamisch kan worden gebruikt. Deze methode zal terugkeren waar als het argument dat niet is nul en kan met succes worden gecast naar het referentietype zonder een te verhogen ClassCastException.

Laten we eens kijken hoe we de isInstance methode met de interface en klassen die we hebben gedefinieerd:

@Test openbare leegte whenUsingIsInstanceProperly_desiredResultsHappen () {Shape shape = new Triangle (); Driehoek driehoek = nieuwe driehoek (); IsoscelesTriangle isoscelesTriangle = nieuwe IsoscelesTriangle (); Triangle isoscelesTriangle2 = nieuwe IsoscelesTriangle (); Vorm niet-specifiekeShape = null; assertTrue (Shape.class.isInstance (vorm)); assertTrue (Shape.class.isInstance (driehoek)); assertTrue (Shape.class.isInstance (gelijkbenigeTriangle)); assertTrue (Shape.class.isInstance (gelijkbenigeTriangle2)); assertFalse (Shape.class.isInstance (niet-specifieke vorm)); assertTrue (Triangle.class.isInstance (vorm)); assertTrue (Triangle.class.isInstance (driehoek)); assertTrue (Triangle.class.isInstance (gelijkbenigeTriangle)); assertTrue (Triangle.class.isInstance (gelijkbenigeTriangle2)); assertFalse (GelijkbenigeTriangle.class.isInstance (vorm)); assertFalse (IsoscelesTriangle.class.isInstance (driehoek)); assertTrue (IsoscelesTriangle.class.isInstance (gelijkbenigeTriangle)); assertTrue (IsoscelesTriangle.class.isInstance (gelijkbenigeTriangle2)); }

Zoals we kunnen zien, de rechterkant kan equivalent zijn aan of specifieker zijn dan de linkerkant. Het verstrekken van nul naar de isInstance methode retourneert false.

4. Class.isAssignableFrom

De Class.isAssignableFrom methode zal terugkeren waar als het Klasse aan de linkerkant van de instructie is hetzelfde als of is een superklasse of superinterface van het opgegeven Klasse parameter.

Laten we onze lessen gebruiken met de isAssignableFrom methode:

@Test openbare leegte whenUsingIsAssignableFromProperly_desiredResultsHappen () {Shape shape = new Triangle (); Driehoek driehoek = nieuwe driehoek (); IsoscelesTriangle isoscelesTriangle = nieuwe IsoscelesTriangle (); Triangle isoscelesTriangle2 = nieuwe IsoscelesTriangle (); assertFalse (shape.getClass (). isAssignableFrom (Shape.class)); assertTrue (shape.getClass (). isAssignableFrom (shape.getClass ())); assertTrue (shape.getClass (). isAssignableFrom (triangle.getClass ())); assertTrue (shape.getClass (). isAssignableFrom (isoscelesTriangle.getClass ())); assertTrue (shape.getClass (). isAssignableFrom (gelijkbenigeTriangle2.getClass ())); assertFalse (triangle.getClass (). isAssignableFrom (Shape.class)); assertTrue (triangle.getClass (). isAssignableFrom (shape.getClass ())); assertTrue (triangle.getClass (). isAssignableFrom (triangle.getClass ())); assertTrue (triangle.getClass (). isAssignableFrom (isoscelesTriangle.getClass ())); assertTrue (triangle.getClass (). isAssignableFrom (isoscelesTriangle2.getClass ())); assertFalse (isoscelesTriangle.getClass (). isAssignableFrom (Shape.class)); assertFalse (isoscelesTriangle.getClass (). isAssignableFrom (shape.getClass ())); assertFalse (isoscelesTriangle.getClass (). isAssignableFrom (triangle.getClass ())); assertTrue (isoscelesTriangle.getClass (). isAssignableFrom (isoscelesTriangle.getClass ())); assertTrue (isoscelesTriangle.getClass (). isAssignableFrom (gelijkbenigeTriangle2.getClass ())); assertFalse (isoscelesTriangle2.getClass (). isAssignableFrom (Shape.class)); assertFalse (isoscelesTriangle2.getClass (). isAssignableFrom (shape.getClass ())); assertFalse (isoscelesTriangle2.getClass (). isAssignableFrom (triangle.getClass ())); assertTrue (isoscelesTriangle2.getClass (). isAssignableFrom (isoscelesTriangle.getClass ())); assertTrue (gelijkbenigeTriangle2.getClass (). isAssignableFrom (gelijkbenigeTriangle2.getClass ())); }

Net als bij de isInstance we kunnen bijvoorbeeld duidelijk zien dat de rechterkant hetzelfde of specifieker moet zijn dan de linkerkant. We kunnen ook zien dat we onze Vorm koppel.

5. De verschillen

Nu we een paar gedetailleerde voorbeelden hebben uiteengezet, gaan we enkele verschillen bespreken:

  1. Om te kunnen gebruiken isInstance, we moeten weten wat een van de klassen is tijdens het compileren.
  2. Enkel en alleen isAssignableFrom kan worden gebruikt met primitieven. Dat moeten we opmerken als we primitieven gebruiken, zal de methode alleen terugkeren waar als het Klasse object en Klasse parameter zijn precies hetzelfde Klasse.
  3. De isAssignableFrom methode zal een NullPointerException als het object dat aan weerszijden van de uitdrukking wordt gebruikt, is nul. Als u een nul naar de isInstance methode, het zal terugkeren false.
  4. We zouden moeten denken isInstance als antwoord op de vraag of het opgegeven object het type is waarmee we het vergelijken (rechtstreeks of via interface of overerving). We kunnen bedenken isAssignableFrom als antwoord op de vraag of we de parameterklasse kunnen definiëren als de objectklasse. Met andere woorden, wil Driehoek driehoek = nieuwe gelijkbenigeTriange () compileren?

6. Conclusie

In deze korte tutorial hebben we zowel de Class.isInstance en Class.isAssignableFrom methoden en onderzocht hun gebruik en hoe ze verschillen.

Zoals altijd is de voorbeeldcode voor deze tutorial te vinden op GitHub.