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)
.