Løsningsforslag - oppgaver i Avsnitt 1.4.2


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

  }
  1. Koden over gir syntaksfeil. Kompilatoren kan ikke avgjøre hvem av de to metodene som skal brukes.
  2. Hvis den andre f-metoden kommenteres vekk, vil kompilatoren godta koden. I metodekallet f(1,1) er begge paramterverdiene heltall, men det siste heltallet blir implisitt konvertert til et float-tall.
  3. Hvis isteden den første f-metoden kommenteres vekk, vil kompilatoren også godta koden. I metodekallet f(1,1) er fortsatt begge paramterverdiene heltall, men det første heltallet blir implisitt konvertert til et float-tall.
  4. Hvis vi beholder begge f-metodene i klassen, kan vi få koden til å bli uten syntaksfeil ved å fortelle hvilken av parametrene som skal være float. Da kan vi skrive f(1,1f) eller f(1f,1).