Java-instans af operatør

1. Introduktion

I denne hurtige vejledning lærer vi om forekomst af operatør i Java.

2. Hvad er forekomst af Operatør?

eksempel på er en binær operatør, der bruges til at teste, om et objekt er af en given type. Resultatet af operationen er enten rigtigt eller falsk. Det er også kendt som typesammenligningsoperatør, fordi det sammenligner forekomsten med typen.

Inden du støber en ukendt genstand, skal forekomst af check skal altid bruges. At gøre dette hjælper med at undgå ClassCastException ved kørselstid.

Det forekomst af operatørs grundlæggende syntaks er:

(objekt) forekomst af (type)

Lad os se et grundlæggende eksempel på forekomst af operatør. Lad os først oprette en klasse Rund:

public class Round {// implementeringsoplysninger}

Lad os derefter oprette en klasse Ring der strækker sig Rund:

public class Ring udvider runde {// implementeringsoplysninger}

Vi kan bruge forekomst af for at kontrollere, om en forekomst af Ring er af Rund type:

@Test offentlig ugyldighed givenWhenInstanceIsCorrect_thenReturnTrue () {Ring ring = ny ring (); Assert.assertTrue (ringinstans af runde); }

3. Hvordan fungerer det forekomst af Operatørens arbejde?

Det forekomst af operatøren arbejder på princippet om is-a-forholdet. Konceptet med et is-a-forhold er baseret på klassearv eller interfaceimplementering.

Lad os oprette en for at demonstrere dette Form grænseflade:

offentlig grænsefladeform {// implementeringsoplysninger}

Lad os også oprette en klasse Cirkel der implementerer Form interface og udvider også Rund klasse:

public class Circle udvider Runde implementer Shape {// implementeringsdetaljer}

Det forekomst af resultatet bliver rigtigt hvis objektet er en forekomst af typen:

@Test offentlig ugyldighed givenWhenObjectIsInstanceOfType_thenReturnTrue () {Cirkelcirkel = ny cirkel (); Assert.assertTrue (cirkelinstans af cirkel); }

Det vil det også være rigtigt hvis objektet er en forekomst af en underklasse af typen:

@Test offentlig ugyldighed giveWhenInstanceIsOfSubtype_thenReturnTrue () {Cirkelcirkel = ny cirkel (); Assert.assertTrue (cirkelinstans af runde); }

Hvis typen er en grænseflade, vender den tilbage rigtigt hvis objektet implementerer grænsefladen:

@Test offentlig ugyldighed givenWhenTypeIsInterface_thenReturnTrue () {Cirkelcirkel = ny cirkel (); Assert.assertTrue (cirkelinstans af form); }

Forekomsten af operatør kan ikke bruges, hvis der ikke er noget forhold mellem objektet, der sammenlignes, og typen, det sammenlignes med.

Lad os oprette en ny klasse Trekant der implementerer Form men har ikke noget forhold til Cirkel:

public class Triangle implement Shape {// implementeringsdetaljer}

Nu, hvis vi bruger forekomst af for at kontrollere, om en Cirkel er en forekomst af Trekant:

@Test offentlig ugyldighed givenWhenComparingClassInDiffHierarchy_thenCompilationError () {Cirkel cirkel = ny cirkel (); Assert.assertFalse (cirkelinstans af trekant); }

Vi får en kompileringsfejl, fordi der ikke er noget forhold mellem Cirkel og Trekant klasser:

java.lang.Error: Uopklaret kompileringsproblem: Uforenelige betingede operandtyper Cirkel og trekant

4. Brug forekomst af med Objekt Type

I Java arver hver klasse implicit fra Objekt klasse. Brug derfor forekomst af operatør med Objekt type vil altid evaluere til rigtigt:

@Test offentlig ugyldighed givenWhenTypeIsOfObjectType_thenReturnTrue () {Thread thread = new Thread (); Assert.assertTrue (trådforekomst af objekt); }

5. Brug af forekomst af Operatør, når et objekt er nul

Hvis vi bruger forekomst af operatør på ethvert objekt, der er nul, det vender tilbage falsk. Der er heller ikke behov for nulkontrol, når du bruger en forekomst af operatør.

@Test offentlig ugyldighed givenWhenInstanceValueIsNull_thenReturnFalse () {Cirkelcirkel = null; Assert.assertFalse (cirkelinstans af runde); }

6. forekomst af og generiske stoffer

Forekomststest og kaster afhænger af at inspicere typeoplysningerne under kørsel. Derfor kan vi ikke bruge forekomst af sammen med slettede generiske typer.

For eksempel, hvis vi forsøger at kompilere følgende uddrag:

offentlig statisk ugyldig sort (Listesamling) {if (collection instanceof List) {// sorter strengene forskelligt} // udeladt}

Så får vi denne kompileringsfejl:

error: illegal generic type for instanceof if (collection instanceof List) {^

Teknisk set har vi kun lov til at bruge forekomst af sammen med reifiedtyper i Java. En type reified, hvis dens typeoplysninger er til stede under kørselstid.

De reified-typer i Java er som følger:

  • Primitive typer som int
  • Ikke-generiske klasser og grænseflader som Snor eller Tilfældig
  • Generiske typer, hvor alle typer er ubegrænsede jokertegn som Sæt eller Kort
  • Rå typer som Liste eller HashMap
  • Arrays af andre genoprettelige typer som f.eks Streng [], Liste [], eller Kort[]

Da parametre for generiske typer ikke reificeres, kan vi heller ikke bruge dem:

public static boolean isOfType (Object input) {return input instanceof T; // kompilerer ikke}

Det er dog muligt at teste mod noget lignende Liste:

hvis (indsamling af listen) {// gør noget}

7. Konklusion

I denne vejledning har vi lært om forekomst af operatøren, og hvordan den bruges. De komplette kodeeksempler er tilgængelige på GitHub.