Oppgave 3
Typeparameterbegrensningen <T extends Number> aksepterer
alle subtyper av Number (inkl. Number selv).
Vi har at Integer er en subtype til Number. Men Object
er ikke subtype til Number. Derfor syntakfeil for setningen skriv(o).
Hvis linjen med syntaksfeilen fjernes, vil programmet gi flg. utskrift:
2. versjon 5 2. versjon 5 1. versjon 5 1. versjon 3.14
Variabelen i som er av type int, blir først gjort
om til en Integer (autoboksing) og deretter brukes den versjonen av
skriv som har Integer som parametertype (2. versjon).
Variabelen k er typen Integer og da brukes den versjonen av
skriv som har Integer som parametertype (2. versjon).
Variabelen n er typen Number og siden Number
oppfyller <T extends Number>, blir den versjonen brukt (1. versjon).
Verdien 3.14 som er av typen double, blir først gjort
om til en Double (autoboksing) og siden Double er en subtype til Number,
oppfyller den <T extends Number>. Dermed blir den versjonen brukt (1. versjon).
Fjernes den versjonen av skriv som har Integer som
type (2. versjon), får vi flg. utskrift:
1. versjon 5 1. versjon 5 1. versjon 5 1. versjon 3.14
Oppgave 4
1. Hvis vi kjører main-programmet slik som det står, vil utskriften fortelle at f-metode nr. 3 brukes. Det kommer av at kompilatoren finner en metode, dvs. nr. 3, der det er eksakt overensstemmelse mellom typen i kallet f(new C()) og parametertypen i metoden.
2. Hvis vi fjerner (kommenterer vekk) den 3. f-metoden, vil kompilatoren gi en feilmelding omtrent som denne: reference to f is ambiguous, both method f(A) in Testprogram and method f(B) in Testprogram match. Vi har at C arver A og implementerer B. Dermed skal både den 1. og den 2. f-metoden kunne brukes. Men Java har ingen regler som forteller hvem av dem kompilatoren da skal velge. De er likeverdige. Derfor får vi feilmeldingen.
3. Hvis vi beholder den 3. f-metoden og isteden fjerner en av de to andre, vil den 3. metoden bli brukt siden vi, slik som i tilfellet 1, da har eksakt overensstemmelse.
4. Hvis vi igjen fjerner den 3. f-metoden og i tillegg fjerner en av de to andre, så vil programmet la seg kompilere og kjøre. Fjerner vi den 1. metoden, vil den 2. bli brukt. Parametertypen i kallet f(new C()) implementerer parametertypen i den 2. metoden. Fjerner vi isteden den 2. metoden, vil den 1. bli brukt siden parametertypen i kallet f(new C()) arver parametertypen i den 1. metoden.
Oppgave 5
class Testprogram { public static void f(int a, float b){} // parameterliste: int, float public static void f(float a, int b){} // parameterliste: float, int public static void main(String... args) { f(1,1); // Feilmelding: The method f(int,float) is ambiguous. } }
f(1,1) er begge paramterverdiene heltall, men det siste heltallet
blir implisitt konvertert til et float-tall.
f(1,1) er fortsatt begge paramterverdiene heltall, men det
første heltallet blir implisitt konvertert til et float-tall.
f(1,1f) eller f(1f,1).