Typeconversie

Uit Wikipedia, de vrije encyclopedie
Ga naar: navigatie, zoeken

In de informatica is een typeconversie (Eng.: type cast) een operatie die een stukje data van een bepaald gegevenstype converteert naar een ander gegevenstype.

Wat is het[bewerken]

Tijdens het schrijven van een computerprogramma in een strong typed taal komt het veelvuldig voor dat een typecast nodig is. Een eenvoudig voorbeeld in de taal C.

int   i = 1;
float f;
f       = (float)i;

Veel programmeertalen kennen een veelheid aan numerieke typen die allemaal naar elkaar geconverteerd kunnen worden. Dit kan direct, of via een ander type. Typeconversie gaat echter veel verder dan dat. Er zijn ook conversies mogelijk van numeriek naar tekens of strings, en andersom al wordt dat laatste vaak geen typecast genoemd maar parsing.

Er zijn formeel twee soorten typecast:

  1. die waarbij de data anders wordt geïnterpreteerd.
  2. die waarbij de data daadwerkelijk omgezet wordt in iets anders.

Bij een typecast van het eerste soort gaat het doorgaans om gehele getallen van verschillende lengte. Een integertype van 4 bytes wordt bijvoorbeeld gecast naar een integertype van 2 bytes. Dit levert dikwijls wel een warning van de compiler op omdat er informatie verloren kan gaan.

Een andere categorie typecasts van het eerste soort is die waarbij objecten worden gecast naar een klasse waarvan ze afgeleid zijn. Dus bijvoorbeeld een object van het type Zeehond wordt gecast naar het type Zoogdier. Of het type Patiënt wordt gecast naar het type Persoon.

Anders is een typecast van het tweede soort. Hierbij wordt de informatie met behulp van een daartoe geschreven functie omgezet. Deze functie wordt vaak met de programmeertaal meegeleverd vanuit de systeembibliotheek die met de compiler meegeleverd wordt. In het geval de taal geïnterpreteerd wordt zit dit dan hardcoded in de interpreter ingebouwd.

Het is ook mogelijk dat de programmeur zelf een typeconversie-functie schrijft. Voorbeelden hiervan zijn de volgende functies.

toDate("12-06-1965")
toString(mijnObject)

Dit soort functie wordt vaak niet als typecast opgevat. De reden hiervan heeft vooral te maken met de syntaxis van de taal, dus het feit dat het gewoon functies zijn, en geen speciale typecast-constructie.

Syntaxis in C(++)[bewerken]

Zoals opgemerkt speelt de syntaxis van de taal een belangrijke rol bij typecasts. Sommige talen, zoals JavaScript en VBScript, kennen helemaal geen typecasts omdat ze weak-typed zijn. Een taal als C kent typecasts met een syntaxis zoals hierboven. In C++ is deze syntaxis uitgebreid met een notatie die aan een functie doet denken met dat verschil dat de functienaam met een typenaam overeenkomt.

int    i = 1;
float  f;
String s; // String is hier een zelfbedachte klasse
f = float(i);
s = String(i);

Vanwege compatibiliteit met C worden voor de basistypes beide notaties ondersteund.

Deze notatie in waarschijnlijk door Stroustrup ingevoerd om onderscheid te maken met een typecast van het eerste soort waarvoor de oude notatie nu bedoeld is.

zoogdier   = (Zoogdier)zeehond;
gewervelde = (Gewervelde)zeehond;
dier       = (Dier)zeehond;
dier       = (Dier)gewervelde;

Impliciete typecast[bewerken]

Veel talen ondersteunen tot op zekere hoogte impliciete typecasts. Zo is het in C mogelijk om zelfs zonder waarschuwing van de compiler te schrijven.

int    i = 1;
float  f;
f    = i;
dier = zeehond;

Sommige talen zijn hier minder gemakkelijk mee, maar toch worden impliciete casts bijna in elke taal wel tot op zekere hoogte toegestaan. Het is een afweging van de ontwerper van de taal tussen veiligheid, leesbaarheid en gemakzucht van de programmeur.