Fundamentale sprogbegreber Typer
dIntProg, F08Typer.2 Typer Primitive typer –boolean –byte, char, short, int, long, float, double Objekttyper –klassetype –interfacetype –arraytype Regel –bland ikke usammenlignelige typer Subtyper –Javas definition på hvornår typer er sammenlignelige
dIntProg, F08Typer.3 Subtyperelation for primitive typer byte ≤ short ≤ int ≤ long ≤ float ≤ double char boolean double d; int i; d = 3.14; i = 7; d = i // ok i = d // ej ok! ≤
dIntProg, F08Typer.4 Subtyperelation for objekttyper Aktør SkuespillerKoreograf klap (heltal n) drej (heltal n) skrivAntalTricks() ElevGnavpotKarakter… Aktør Koreograf ≤ Skuespiller ≤ Aktør ≤ Object Elev ≤ Karakter... ≤ Skuespiller Gnavpot ≤ Object
dIntProg, F08Typer.5 Eksempler Skuespiller s; Gnavpot g; s= new Skuespiller(...); g= new Gnavpot(...); s= g; // ok g= s; // ej ok! Skuespiller Gnavpot Køretøj k; Cykel c; k= new Bil(...);// ok c= new Cykel(...); k= c; // ok c= k; // ej ok! Køretøj Cykel Bil
dIntProg, F08Typer.6 Typeregel for assignment Assignmentsætningen giver kun mening når typen af udtrykket på højresiden er en subtype af variablen på venstresiden. v= exp; T(v) ≥ T(Exp) Det giver mening at assigne et cykelobjekt til en variabel af typen Køretøj, men det giver ikke mening at assigne et køretøj (der kan være mange forskellige ting) til en variabel af typen Cykel. Køretøj Cykel
dIntProg, F08Typer.7 Forfremmelse og begrænsning (1) Forfremmelse –En værdi af en subtype kan ved en implicit typekonvertering (automatisk) forfremmes til en værdi af en supertype Begrænsning –En værdi af en supertype kan ved en eksplicit typekonvertering (et såkaldt ”type cast”) begrænses til en værdi af en subtype Eksempel: 9 + (int) ((6 * 2) / 2.5) 9 + (int) ( 12 / 2.5) 9 + (int) ( 12.0 / 2.5) 9 + (int)
dIntProg, F08Typer.8 Forfremmelse og begrænsning (2) double d1, d2; int i; d2= 3.14; // ok? d1= 7; // ok? i= d1; // ok? i= d2; // ok? i= (int) d1; // ok? i= (int) d2; // ok? int ≤ double
dIntProg, F08Typer.9 Forfremmelse og begrænsning (3) Køretøj k1, k2; Cykel c; k1= new Bil(...); // ok? k2= new Cykel(...); // ok? c= k1; // ok? c= k2; // ok? c= (Cykel) k1; // ok? c= (Cykel) k2; // ok? Cykel ≤ Køretøj Bil ≤ Køretøj Køretøj Cykel Bil
dIntProg, F08Typer.10 Konstanter (literals) LiteralType 2int 2.0double ‘2’char “2”String “two”String
dIntProg, F08Typer.11 Advarsel: Java behandler tegn som tal Javas subtyperelation: char ≤ int ≤ double Forfremmelse automatisk hvis det er nødvendigt evaluerer til 3.5 ‘2’ + 1 evaluerer til 51 !!! Begrænsning kun ved eksplicitte cast (int) ( ) evaluerer til 3 (char) (‘2’ + 1) evaluerer til ‘3’