Class.isInstance vs Class.isAssignableFrom

1. Introduktion

I denne hurtige vejledning skal vi se på forskellen mellem Class.isInstance og Class.isAssignableFrom. Vi lærer, hvordan man bruger hver metode, og hvad forskellene er mellem dem.

2. Opsætning

Lad os oprette en grænseflade og et par klasser, der skal bruges, mens vi udforsker Class.isInstance og Class.isAssignableFrom funktionalitet.

Lad os først definere en grænseflade:

offentlig grænsefladeform {}

Lad os derefter definere en klasse, der implementeres Form:

public class Triangle implement Shape {}

Nu opretter vi en klasse, der udvides Trekant:

offentlig klasse IsoscelesTriangle udvider Triangle {}

3. Class.isInstance

Det isInstance metode til Klasse klasse svarer til forekomst af operatør. Det isInstance metode blev introduceret i Java 1.1, fordi den kan bruges dynamisk. Denne metode vender tilbage rigtigt hvis argumentet ikke er det nul og kan med succes kastes til referencetypen uden at hæve a ClassCastException.

Lad os se på, hvordan vi kan bruge isInstance metode med det interface og klasser, vi definerede:

@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øjre side kan svare til eller være mere specifik end venstre side. At sørge for nul til isInstance metoden vender tilbage falsk.

4. Class.isAssignableFrom

Det Class.isAssignableFrom metoden vender tilbage rigtigt hvis den Klasse på venstre side af erklæringen er den samme som eller er en superklasse eller superinterface af den leverede Klasse parameter.

Lad os bruge vores klasser med isAssignableFrom metode:

@Test offentligt ugyldigt 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 (form.getClass (). erAssignableFrom (isoscelesTriangle.getClass ())); assertTrue (shape.getClass (). isAssignableFrom (isoscelesTriangle2.getClass ())); assertFalse (triangle.getClass (). erAssignableFrom (Shape.class)); assertTrue (triangle.getClass (). erAssignableFrom (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 (form.getClass ())); assertFalse (isoscelesTriangle.getClass (). isAssignableFrom (Triple.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 Eksempel kan vi tydeligt se, at højre side enten skal være den samme eller mere specifik end den venstre side. Vi kan også se, at vi aldrig er i stand til at tildele vores Form interface.

5. Forskellene

Nu hvor vi har lagt et par detaljerede eksempler, lad os gå igennem nogle af forskellene:

  1. For at bruge isInstance, vi har brug for at vide, hvad en af ​​klasserne er på kompileringstidspunktet.
  2. Kun isAssignableFrom kan bruges med primitiver. Det skal vi bemærke hvis vi bruger primitive, vender metoden kun tilbage rigtigt hvis den Klasse objekt og Klasse parameter er nøjagtigt den samme Klasse.
  3. Det isAssignableFrom metoden vil kaste en NullPointerException hvis det objekt, der bruges på hver side af udtrykket, er nul. Hvis du giver en nul til isInstance metode, vender den tilbage falsk.
  4. Vi skal tænke på isInstance som besvare spørgsmålet om, hvorvidt det leverede objekt er den type, vi sammenligner det med (enten direkte eller via interface eller arv). Vi kan tænke på isAssignableFrom som at besvare spørgsmålet om, hvorvidt vi kan definere parameterklassen som objektklassen. Med andre ord vilje Trekant trekant = ny IsoscelesTriange () udarbejde?

6. Konklusion

I denne korte vejledning kiggede vi på begge Class.isInstance og Class.isAssignableFrom metoder og udforskede deres anvendelse, og hvordan de adskiller sig.

Som altid kan eksempelkoden til denne vejledning findes på GitHub.


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