Java-instantie van Operator

1. Inleiding

In deze korte tutorial leren we over de instantie van operator in Java.

2. Wat is het instantie van Operator?

instanceof is een binaire operator die wordt gebruikt om te testen of een object van een bepaald type is. Het resultaat van de operatie is ofwel waar of false. Het wordt ook wel typevergelijkingsoperator genoemd omdat het de instantie vergelijkt met type.

Voordat een onbekend object wordt gegoten, moet de instantie van check moet altijd worden gebruikt. Dit helpt bij het vermijden ClassCastException tijdens runtime.

De instantie van de basissyntaxis van de operator is:

(object) instantie van (type)

Laten we een eenvoudig voorbeeld bekijken voor de instantie van operator. Laten we eerst een klas maken Ronde:

public class Round {// implementatiedetails}

Laten we vervolgens een klas maken Ring dat strekt zich uit Ronde:

openbare klasse Ring verlengt Round {// implementatiedetails}

We kunnen gebruiken instantie van om te controleren of een exemplaar van Ring is van Ronde type:

@Test openbare ongeldig gegevenWhenInstanceIsCorrect_thenReturnTrue () {Ring ring = nieuwe Ring (); Assert.assertTrue (ringinstantie van Round); }

3. Hoe werkt het instantie van Operator werk?

De instantie van operator werkt volgens het principe van de is-a-relatie. Het concept van een is-a-relatie is gebaseerd op klasse-overerving of interface-implementatie.

Om dit te demonstreren, maken we een Vorm koppel:

openbare interface Shape {// implementatiedetails}

Laten we ook een klas maken Cirkel dat implementeert de Vorm interface en breidt ook de Ronde klasse:

openbare klasse Cirkel breidt zich uit Rond implementeert Vorm {// implementatiedetails}

De instantie van resultaat zal zijn waar als het object een instantie is van het type:

@Test openbare leegte gegevenWhenObjectIsInstanceOfType_thenReturnTrue () {Circle circle = new Circle (); Assert.assertTrue (cirkel instantie van Cirkel); }

Het zal ook zijn waar als het object een instantie is van een subklasse van het type:

@Test openbare ongeldige giveWhenInstanceIsOfSubtype_thenReturnTrue () {Circle circle = new Circle (); Assert.assertTrue (cirkel voorbeeld van Round); }

Als het type een interface is, zal het terugkeren waar als het object de interface implementeert:

@Test openbare leegte gegevenWhenTypeIsInterface_thenReturnTrue () {Circle circle = new Circle (); Assert.assertTrue (cirkel instantie van vorm); }

Het exemplaar van operator kan niet worden gebruikt als er geen relatie is tussen het object dat wordt vergeleken en het type waarmee het wordt vergeleken.

Laten we een nieuwe klas maken Driehoek dat implementeert Vorm maar heeft geen relatie met Cirkel:

openbare klasse Triangle implementeert Shape {// implementatiedetails}

Nu, als we gebruiken instantie van om te controleren of a Cirkel is een voorbeeld van Driehoek:

@Test openbare leegte gegevenWhenComparingClassInDiffHierarchy_thenCompilationError () {Circle circle = new Circle (); Assert.assertFalse (cirkel instantie van Driehoek); }

We krijgen een compilatiefout omdat er geen verband is tussen de Cirkel en de Driehoek klassen:

java.lang.Error: onopgelost compilatieprobleem: incompatibele voorwaardelijke operandtypen Circle en Triangle

4. Met behulp van instantie van met de Voorwerp Type

In Java erft elke klasse impliciet van de Voorwerp klasse. Gebruik daarom de instantie van operator met de Voorwerp type zal altijd evalueren naar waar:

@ Test openbare ongeldige gegevenWhenTypeIsOfObjectType_thenReturnTrue () {Thread thread = nieuwe Thread (); Assert.assertTrue (thread instantie van Object); }

5. Gebruik de instantie van Operator wanneer een object is nul

Als we de instantie van operator op elk object dat is nul, het keert terug false. Ook is er geen null-controle nodig bij het gebruik van een instantie van operator.

@Test openbare ongeldig gegevenWhenInstanceValueIsNull_thenReturnFalse () {Circle circle = null; Assert.assertFalse (cirkelinstantie van Round); }

6. instantie van en generieke geneesmiddelen

Instantietests en casts zijn afhankelijk van het inspecteren van de type-informatie tijdens runtime. Daarom kunnen we niet gebruiken instantie van samen met gewiste generieke typen.

Als we bijvoorbeeld proberen het volgende fragment te compileren:

openbare statische ongeldige sortering (lijstverzameling) {if (verzameling instantie van lijst) {// sorteer strings anders} // weggelaten}

Dan krijgen we deze compilatiefout:

fout: ongeldig generiek type bijvoorbeeld if (collection instanceof List) {^

Technisch gezien mogen we alleen gebruiken instantie van samen met reifiedtypen in Java. Een type wordt versterkt als de type-informatie tijdens runtime aanwezig is.

De reified types in Java zijn als volgt:

  • Primitieve typen zoals int
  • Niet-generieke klassen en interfaces zoals Draad of Willekeurig
  • Generieke typen waarin alle typen onbegrensde jokertekens zijn, zoals Set of Kaart
  • Ruwe soorten zoals Lijst of HashMap
  • Arrays van andere reificeerbare typen zoals String [], lijst [], of Kaart[]

Omdat generieke typeparameters niet zijn aangepast, kunnen we ze ook niet gebruiken:

openbare statische boolean isOfType (Objectinvoer) {retourinvoerinstantie van T; // zal niet compileren}

Het is echter mogelijk om te testen tegen zoiets als Lijst:

if (verzameling instantie van lijst) {// doe iets}

7. Conclusie

In deze zelfstudie hebben we geleerd over de instantie van operator en hoe deze te gebruiken. De volledige codevoorbeelden zijn beschikbaar op GitHub.


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