Class.isInstance vs Class.isAssignableFrom

1. Introduksjon

I denne raske opplæringen skal vi se på forskjellen mellom Class.isInstance og Class.isAssignableFrom. Vi lærer hvordan du bruker hver metode og hva forskjellene er mellom dem.

2. Oppsett

La oss sette opp et grensesnitt og et par klasser å bruke mens vi utforsker Class.isInstance og Class.isAssignableFrom funksjonalitet.

La oss først definere et grensesnitt:

offentlig grensesnittform {}

Deretter la oss definere en klasse som implementeres Form:

offentlig klasse Triangle implementerer Shape {}

Nå lager vi en klasse som utvides Triangel:

offentlig klasse IsoscelesTriangle utvider Triangle {}

3. Class.isInstance

De isInstance metoden på Klasse klasse tilsvarer tilfelle av operatør. De isInstance metoden ble introdusert i Java 1.1 fordi den kan brukes dynamisk. Denne metoden vil komme tilbake ekte hvis argumentet ikke er det null og kan vellykkes til referansetypen uten å heve a ClassCastException.

La oss se på hvordan vi kan bruke isInstance metode med grensesnittet og klassene vi definerte:

@Test offentlig ugyldig nårUsingIsInstanceProperly_desiredResultsHappen () {Shape shape = new Triangle (); Trekant trekant = ny Trekant (); IsoscelesTriangle isoscelesTriangle = ny IsoscelesTriangle (); Triangle isoscelesTriangle2 = ny IsoscelesTriangle (); Form nonspecificShape = null; assertTrue (Shape.class.isInstance (form)); assertTrue (Shape.class.isInstance (trekant)); assertTrue (Shape.class.isInstance (isoscelesTriangle)); assertTrue (Shape.class.isInstance (isoscelesTriangle2)); assertFalse (Shape.class.isInstance (nonspecificShape)); assertTrue (Triangle.class.isInstance (form)); assertTrue (Triangle.class.isInstance (trekant)); assertTrue (Triangle.class.isInstance (isoscelesTriangle)); assertTrue (Triangle.class.isInstance (isoscelesTriangle2)); assertFalse (IsoscelesTriangle.class.isInstance (form)); assertFalse (IsoscelesTriangle.class.isInstance (trekant)); assertTrue (IsoscelesTriangle.class.isInstance (isoscelesTriangle)); assertTrue (IsoscelesTriangle.class.isInstance (isoscelesTriangle2)); }

Som vi kan se, høyre side kan tilsvare eller være mer spesifikk enn venstre side. Å gi null til isInstance metoden returnerer falsk.

4. Class.isAssignableFrom

De Class.isAssignableFrom metoden vil komme tilbake ekte hvis Klasse på venstre side av uttalelsen er den samme som eller er en superklasse eller supergrensesnitt av den medfølgende Klasse parameter.

La oss bruke timene våre med isAssignableFrom metode:

@Test offentlig ugyldig nårUsingIsAssignableFromProperly_desiredResultsHappen () {Shape shape = new Triangle (); Trekant trekant = ny Trekant (); IsoscelesTriangle isoscelesTriangle = ny IsoscelesTriangle (); Triangle isoscelesTriangle2 = ny IsoscelesTriangle (); assertFalse (shape.getClass (). erAssignableFrom (Shape.class)); assertTrue (shape.getClass (). isAssignableFrom (shape.getClass ())); assertTrue (shape.getClass (). isAssignableFrom (triangle.getClass ())); assertTrue (shape.getClass (). isAssignableFrom (isoscelesTriangle.getClass ())); assertTrue (shape.getClass (). isAssignableFrom (isoscelesTriangle2.getClass ())); assertFalse (triangel.getClass (). erAssignableFrom (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 (isoscelesTriangle2.getClass ())); assertFalse (isoscelesTriangle2.getClass (). isAssignableFrom (Shape.class)); assertFalse (isoscelesTriangle2.getClass (). isAssignableFrom (form.getClass ())); assertFalse (isoscelesTriangle2.getClass (). isAssignableFrom (Triangle.getClass ())); assertTrue (isoscelesTriangle2.getClass (). isAssignableFrom (isoscelesTriangle.getClass ())); assertTrue (isoscelesTriangle2.getClass (). isAssignableFrom (isoscelesTriangle2.getClass ())); }

Som med isInstance For eksempel kan vi tydelig se at høyre side må være den samme eller mer spesifikk enn venstre side. Vi kan også se at vi aldri kan tildele våre Form grensesnitt.

5. Forskjellene

Nå som vi har lagt ut et par detaljerte eksempler, la oss gå gjennom noen av forskjellene:

  1. For å bruke isInstance, må vi vite hva en av klassene er på kompileringstidspunktet.
  2. Kun isAssignableFrom kan brukes med primitiver. Vi bør merke oss det hvis vi bruker primitive, vil metoden bare komme tilbake ekte hvis Klasse objekt og Klasse parameteren er nøyaktig den samme Klasse.
  3. De isAssignableFrom metoden vil kaste en NullPointerException hvis objektet som brukes på hver side av uttrykket er null. Hvis du gir en null til isInstance metoden, vil den komme tilbake falsk.
  4. Vi burde tenke på isInstance som svar på spørsmålet om det medfølgende objektet er den typen vi sammenligner det med (enten direkte eller via grensesnitt eller arv). Vi kan tenke oss isAssignableFrom som å svare på spørsmålet om vi kan definere parameterklassen som objektklassen. Med andre ord vilje Trekanttrekant = ny IsoscelesTriange () kompilere?

6. Konklusjon

I denne korte opplæringen så vi på begge Class.isInstance og Class.isAssignableFrom metoder og utforsket bruken av dem og hvordan de skiller seg ut.

Som alltid kan eksempelkoden for denne opplæringen finnes på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found