Generiska typer

Sven-Olof Nyström
OOP med Java våren -25
Informationsteknologi
Uppsala Universitet

De flesta programspråk (även Java) tillåter att man deklarerar en array av int, en array av String eller en array av någon annan datatyp. Hur det data som lagras i arrayen ska se ut anges med nånting som kan beskrivas som en slags typ-parameter.

I Java går man ett steg längre: istället för att bara kunna använda typ-parametrar i någon enstaka fördefinierad typ är det här möjligt att definiera nya typer som tar parametrar.

Generiska typer kom med Java 5. Läroböcker för tidigare versioner av Java nämner inte dem.

Vi börjar med ett enkelt exempel.

Generiska typer—exempel

I detta exempel definierar jag en klass Box. Klassen representerar en "låda" som kan lagra värden av godtycklig typ. Typ-parametern (X) anger vilken typ av data som lagras.

public class Box<X> {
    private X x;

    public X getX() {
        return x;
    }

    public void setX (X x0) {
        x = x0;
    }
}

Genererisk typ—test

Ett enkelt testprogram som använder klassen Box för att lagra en sträng och ett heltal.

    public static void main (String [] arg) {
        Box<String> b = new Box<String> ();
        b.setX("Foo");
        String s = b.getX();
        System.out.println(s);

        Box<Integer> c = new Box<Integer> ();
        c.setX(42);
        int i = c.getX();
        System.out.println(i);
    }

Allmänt om generiska typer

Jag beskriver autobox/unboxing i avsnitt 4.3.

Parametriska metoder

Även metoder kan definieras med en typ-parameter. Vi kommer inte att använda denna möjlighet i kursen, men nedan följer ett mycket enkelt exempel.

class Id {
    public static <T> T id(T x) {
        return x;
    }
}