Class.isInstance vs Class.isAssignableFrom

1. Bemutatkozás

Ebben a gyors bemutatóban megvizsgáljuk a különbségeket Class.isInstance és Class.isAssignableFrom. Megtudjuk, hogyan kell használni az egyes módszereket, és mi a különbség közöttük.

2. Beállítás

Állítsunk be egy interfészt és egy pár osztályt, amelyeket használhatunk a Class.isInstance és Class.isAssignableFrom funkcionalitás.

Először határozzunk meg egy interfészt:

nyilvános felület alakja {}

Ezután határozzunk meg egy osztályt, amely megvalósítja Alak:

a háromszög nyilvános osztálya alkalmazza az alakzatot {}

Most létrehozunk egy kiterjeszthető osztályt Háromszög:

nyilvános osztályú IsoscelesTriangle kiterjeszti a háromszöget {}

3. Class.isInstance

A isInstance módszer a Osztály osztály egyenértékű a Például az operátor. A isInstance módszert vezették be a Java 1.1-ben, mert dinamikusan használható. Ez a módszer visszatér igaz ha az érv nem nulla és sikeresen átküldhető a referencia típusra anélkül, hogy a ClassCastException.

Nézzük meg, hogyan használhatjuk a isInstance módszer az általunk definiált interfésszel és osztályokkal:

@Test public void whenUsingIsInstanceProperly_desiredResultsHappen () {Shape shape = new Triangle (); Háromszög háromszög = új Háromszög (); IsoscelesTriangle isoscelesTriangle = új IsoscelesTriangle (); Háromszög egyenlő szárú háromszög2 = új egyenlő szárú háromszög (); Alakzat nonspecificShape = null; assertTrue (Alak.osztály.isInstance (alakzat)); assertTrue (Alak.osztály.isInstance (háromszög)); assertTrue (Alak.osztály.isInstance (egyenlő szárú háromszög)); assertTrue (Alak.osztály.isInstance (egyenlő szárú Háromszög2)); assertFalse (Alak.osztály.isInstance (nonspecificShape)); assertTrue (Háromszög.osztály.isInstance (alak)); assertTrue (Háromszög.osztály.isInstance (háromszög)); assertTrue (háromszög.osztály.isInstance (egyenlő szárú háromszög)); assertTrue (háromszög.osztály.isInstance (egyenlő szárú háromszög2)); assertFalse (IsoscelesTriangle.class.isInstance (shape)); assertFalse (IsoscelesTriangle.class.isInstance (háromszög)); assertTrue (IsoscelesTriangle.class.isInstance (isoscelesTriangle)); assertTrue (IsoscelesTriangle.class.isInstance (isoscelesTriangle2)); }

Ahogy látjuk, a jobb oldal egyenértékű vagy specifikusabb lehet, mint a bal oldal. Gondoskodás nulla hoz isInstance metódus visszatér hamis.

4. Class.isAssignableFrom

A Class.isAssignableFrom módszer visszatér igaz ha a Osztály az utasítás bal oldalán megegyezik a megadott szuperosztályával vagy szuperinterfészével Osztály paraméter.

Használjuk az osztályainkat a isAssignableFrom módszer:

@Test public void whenUsingIsAssignableFromProperly_desiredResultsHappen () {Shape shape = new Triangle (); Háromszög háromszög = új Háromszög (); IsoscelesTriangle isoscelesTriangle = új IsoscelesTriangle (); Háromszög egyenlő szárú háromszög2 = új egyenlő szárú háromszög (); 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 (egyenlő szárú háromszög2.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 (egyenlő szárú Háromszög.getClass (). isAssignableFrom (Alak.osztály)); assertFalse (egyenlőségű háromszög.getClass (). isAssignableFrom (shape.getClass ())); assertFalse (isoscelesTriangle.getClass (). isAssignableFrom (triangle.getClass ())); assertTrue (isoscelesTriangle.getClass (). isAssignableFrom (isoscelesTriangle.getClass ())); assertTrue (isoscelesTriangle.getClass (). isAssignableFrom (isoscelesTriangle2.getClass ())); assertFalse (egyenlő szárú Háromszög2.getClass (). isAssignableFrom (Alak.osztály)); assertFalse (egyenlőségűTriangle2.getClass (). isAssignableFrom (shape.getClass ())); assertFalse (egyenlőségűTriangle2.getClass (). isAssignableFrom (triangle.getClass ())); assertTrue (isoscelesTriangle2.getClass (). isAssignableFrom (isoscelesTriangle.getClass ())); assertTrue (isoscelesTriangle2.getClass (). isAssignableFrom (isoscelesTriangle2.getClass ())); }

Mint a isInstance Például világosan láthatjuk, hogy a jobb oldali oldalnak azonosnak vagy specifikusabbnak kell lennie, mint a bal oldali. Azt is láthatjuk, hogy soha nem vagyunk képesek kijelölni a feladatunkat Alak felület.

5. A különbségek

Most, hogy bemutattunk néhány részletes példát, nézzük át a különbségeket:

  1. Használata érdekében isInstance, tudnunk kell, hogy mi az egyik osztály fordítási időben.
  2. Csak isAssignableFrom primitívekkel használható. Meg kell jegyeznünk ha primitíveket használunk, akkor a módszer csak visszatér igaz ha a Osztály tárgy és Osztály paraméterek pontosan megegyeznek Osztály.
  3. A isAssignableFrom módszer dobja a NullPointerException ha a kifejezés mindkét oldalán használt objektum az nulla. Ha megadja a nulla hoz isInstance módszerrel visszatér hamis.
  4. Gondolkodnunk kellene isInstance válaszként arra a kérdésre, hogy a megadott objektum az a típus, amelyhez összehasonlítjuk (akár közvetlenül, akár interfészen, vagy öröklésen keresztül). Eszünkbe juthat isAssignableFrom válaszként arra a kérdésre, hogy definiálhatjuk-e a paraméterosztályt objektumosztályként. Más szóval akarat Háromszög háromszög = új egyenlőségű háromszög () összeállítani?

6. Következtetés

Ebben a rövid bemutatóban megnéztük mind a Class.isInstance és Class.isAssignableFrom módszereket, és feltárta azok használatát és miben különböznek egymástól.

Mint mindig, az oktatóanyag példakódja megtalálható a GitHubon.