Class.isInstance vs Class.isAssignableFrom

1. Úvod

V tomto rýchlom návode sa pozrieme na rozdiel medzi nimi Trieda. Je inštancia a Class.isAssignableFrom. Dozvieme sa, ako používať jednotlivé metódy a aké sú medzi nimi rozdiely.

2. Inštalácia

Poďme nastaviť rozhranie a niekoľko tried, ktoré budeme používať pri skúmaní Trieda. Je inštancia a Class.isAssignableFrom funkčnosť.

Najskôr definujeme rozhranie:

tvar verejného rozhrania {}

Ďalej definujme triedu, ktorá sa implementuje Tvar:

verejná trieda Triangle implementuje tvar {}

Teraz vytvoríme triedu, ktorá sa rozšíri Trojuholník:

verejná trieda IsoscelesTriangle extendens Triangle {}

3. Trieda. Je inštancia

The isInstance metóda na Trieda trieda je ekvivalentná s inštancia operátor. The isInstance metóda bola zavedená v prostredí Java 1.1, pretože sa dá použiť dynamicky. Táto metóda sa vráti pravda ak argument nie je nulový a dá sa úspešne použiť na referenčný typ bez zvýšenia a ClassCastException.

Pozrime sa, ako môžeme použiť isInstance metóda s rozhraním a triedami, ktoré sme definovali:

@Test public void whenUsingIsInstanceProperly_desiredResultsHappen () {Shape shape = new Triangle (); Trojuholník trojuholník = nový trojuholník (); IsoscelesTriangle isoscelesTriangle = new IsoscelesTriangle (); Rovnoramenný trojuholníkTriangle2 = nový rovnoramenný trojuholník (); Shape nonspecificShape = null; assertTrue (Shape.class.isInstance (tvar)); assertTrue (Shape.class.isInstance (trojuholník)); assertTrue (Shape.class.isInstance (isoscelesTriangle)); assertTrue (Shape.class.isInstance (isoscelesTriangle2)); assertFalse (Shape.class.isInstance (nešpecifickýShape)); assertTrue (Triangle.class.isInstance (tvar)); assertTrue (Triangle.class.isInstance (trojuholník)); assertTrue (Triangle.class.isInstance (isoscelesTriangle)); assertTrue (Triangle.class.isInstance (isoscelesTriangle2)); assertFalse (IsoscelesTriangle.class.isInstance (tvar)); assertFalse (IsoscelesTriangle.class.isInstance (trojuholník)); assertTrue (IsoscelesTriangle.class.isInstance (isoscelesTriangle)); assertTrue (IsoscelesTriangle.class.isInstance (isoscelesTriangle2)); }

Ako vidíme, pravá strana môže byť rovnaká alebo konkrétnejšia ako ľavá strana. Poskytovanie nulový do isInstance metóda sa vracia nepravdivé.

4. Class.isAssignableFrom

The Class.isAssignableFrom metóda sa vráti pravda ak Trieda na ľavej strane výpisu je rovnaká alebo je nadtrieda alebo nadrozhranie daného výrazu Trieda parameter.

Poďme používať naše triedy s isAssignableFrom metóda:

@Test public void whenUsingIsAssignableFromProperly_desiredResultsHappen () {Shape shape = new Triangle (); Trojuholník trojuholník = nový trojuholník (); IsoscelesTriangle isoscelesTriangle = new IsoscelesTriangle (); Rovnoramenný trojuholníkTriangle2 = nový rovnoramenný trojuholník (); 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 (isoscelesTriangle2.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 (isoscelesTriangle2.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 (isoscelesTriangle2.getClass (). isAssignableFrom (isoscelesTriangle2.getClass ())); }

Rovnako ako v prípade isInstance napríklad jasne vidíme, že pravá strana musí byť rovnaká alebo konkrétnejšia ako ľavá strana. Vidíme tiež, že nikdy nedokážeme priradiť svoje Tvar rozhranie.

5. Rozdiely

Teraz, keď sme uviedli niekoľko podrobných príkladov, prejdime si niektoré z rozdielov:

  1. Aby bolo možné použiť isInstance, potrebujeme vedieť, ktorá z tried je v čase kompilácie.
  2. Iba isAssignableFrom môžu byť použité s primitívmi. Mali by sme si to všimnúť ak používame primitívy, metóda sa vráti iba pravda ak Trieda objekt a Trieda parametre sú úplne rovnaké Trieda.
  3. The isAssignableFrom metóda vyhodí a NullPointerException ak je objekt použitý na obidvoch stranách výrazu nulový. Ak poskytnete a nulový do isInstance metóda, vráti sa nepravdivé.
  4. Mali by sme myslieť na isInstance ako odpoveď na otázku, či je poskytnutý objekt typ, s ktorým ho porovnávame (buď priamo, alebo cez rozhranie alebo dedenie). Môžeme myslieť isAssignableFrom ako odpoveď na otázku, či môžeme definovať triedu parametrov ako triedu objektov. Inými slovami, bude Trojuholníkový trojuholník = nový IsoscelesTriange () zostaviť?

6. Záver

V tomto krátkom tutoriáli sme sa pozreli na obe Trieda. Je inštancia a Class.isAssignableFrom metódy a skúmali ich použitie a ako sa líšia.

Ako vždy, ukážkový kód tohto tutoriálu nájdete na GitHub.


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