Algoritmer och datastrukturer Frelsning 3 Generiska klasser och
- Slides: 38
Algoritmer och datastrukturer Föreläsning 3 Generiska klasser och metoder (Weiss kap. 4. 7 -8, Skansholm 17. 1) u Generiska <klasser> u <Generiska> klassmetoder u Råa typer u Typbegränsningsuttryck u Jämförelseklasser ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 1
Definition av generisk klass public class klassnamn <typuttryck 1, typuttryck 2, . . . > { // metoder och variabler }; Typvariablerna i typuttrycken får användas för att sätta typ på – variabler – i konstruktorer och metoder: parametrar, lokala variabler, returtyper (dock ej i statiska klassmetoder) u u En generisk klass kan ha flera olika typvariabler – typvariabelnamnen kan väljas fritt (men inled med stor bokstav) Även interface kan vara generiska ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 2
Instansiering av generisk klass Klassnamn <typ 1, typ 2, . . . > objektnamn; u Vilka typer en generisk klass kan instansieras med beror på hur typerna används i klassen ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 3
Exempel: Minnescell för heltal public class Int. Memory. Cell { private Integer value = null; public void store(Integer value) { this. value = value; } public Integer get. Value() { return value; } } ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 4
Exempel: Minnescell för flyttal public class Float. Memory. Cell { private Float value = null; public void store(Float value) { this. value = value; } public Float get. Value() { return value; } } …∞ ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 5
Exempel: Generell (generisk) minesscell public class Memory. Cell<T> { private T value = null; public void store(T value) { this. value = value; } public T get. Value() { return value; } } ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 6
Exempel: Instansiering av generisk minesscell Memory. Cell<Integer> a = new Memory. Cell<Integer>(); a. store(123); Integer i = a. get. Value(); Memory. Cell<String> b = new Memory. Cell<String>(); b. store(”Generisk”); String s = b. get. Value(); . . . och varför inte Memory. Cell<String>> c = new Memory. Cell<String>> (); c. store(b); Memory. Cell<String>x = c. get. Value(); ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 7
Generiska klassmetoder synlighetsmodifierare static <T 1, T 2, . . . > returtyp metodnamn parameterlista {. . . } u u u T 1, T 2, . . . kan vara typvariabler eller typuttryck med variabler och wild-cards. Typvariablerna får användas överallt i metoden men inte som elementtyper i fält. En klassmetod får ej använda klassens generiska typparametrar utan måste sina ha egna. ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 8
Generiska klassmetoder u Exempel Typparameter Returtyp Metodnamn public static <T> T namn(){…} public static <T> List<T> namn(){…} ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 9
Generiska klassmetoder Exempel: En (? ) metod som byter plats på två element i en lista class List. Ops { public static void swap(List<Integer> l, int i, int j){ Integer temp = l. get(i); l. set(i, l. get(j)); l. set(j, temp); } public static void swap(List<Float> l, int i, int j){ Float temp = l. get(i); l. set(i, l. get(j)); l. set(j, temp); } …∞ } ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 10
Generiska klassmetoder Exempel: En metod som byter plats på två element i en lista class List. Ops { public static <T> void swap(List<T> l, int i, int j) { T temp = l. get(i); l. set(i, l. get(j)); l. set(j, temp); } } Anrop: List<String> sl = new Array. List<>(); . . . List. Ops. swap(sl, 2, 37); eller List. Ops. <String>swap(sl, 2, 37); ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 11
Typradering och råa typer u Bakåtkompatibilitet med äldre java-versioner u Typvariablerna raderas av kompilatorn u Kvar blir ickegeneriska ”råa” typer u Standardklasser som är generiska kan användas utan typvariabler – I java betyder List ung. samma sak som List<Object> ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 12
Generiska typer och subtyper u Är Array. List<A> en subtyp till List<A>? Ja u Får en metod med signaturen f(List<A>) anropas med Array. List<A> som argument? Ja Om B är en subtyp till A u Är då List<B> en subtyp till List<A>? Nej u Får en metod med signaturen f(List<A>) anropas - med List<B> som argument? Nej - med Array. List<B> som argument? Nej ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 13
Vad är problemet? A B u u C Om List<B> vore en subtyp till List<A> skulle typsystemet bli osäkert och typkorrekta program kunna ge upphov till typfel vid run-time: List<A> li = new Array. List<B>(); // Ej tillåtet men hypotetiskt i exemplet li. add(new C()); // Statiskt typkorrekt eftersom C är subtyp till A När satsen exekveras får vi ett run-time-typfel eftersom li pekar på en Array. List<B>, men C är ju inte en subtyp till B! ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 14
Subtypsrelationer - exempel Ex. public class Rectangle { private int width, height; public Rectangle(int width, int height) { this. width = width; this. height = height; } public int get. Area() { return width*height; } public int get. Width() { return width; } public int get. Height() { return height; } public boolean equals(Object other) {. . . } } ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 15
Subtypsrelationer Ex. public class Square extends Rectangle { public Square(int side) { super(side, side); } Rectangle Square public int get. Side() { return get. Width(); } } ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 16
Subtypsrelationer public static void f 1(Rectangle x) Rectangle f 1(new Rectangle()); f 1(new Square()); ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ // OK Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Square Förel. 3: Generiska klasser och metoder Nr: 5 17
Subtypsrelationer public static void f 2(List<Rectangle> x) f 2(new Array. List<Rectangle>()); //OK Rectangle f 2(new Linked. List<Rectangle>()); // OK f 2(new Array. List<Square>()); // TYPFEL! Square f 2(new Linked. List<Square>()); // TYPFEL! ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 18
wild card Typbegränsningsuttryck ? matchas av vilken typ som helst <? extends T > matchas av T och alla subtyper till T <? super T > matchas av T och alla supertyper till T u Ex. Comparator<? super T> ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 19
Exempel 1: Typbegränsning public static void f 3(List<? extends Rectangle> x) f 3(new Array. List< Rectangle >()); // OK Rectangle f 3(new Linked. List< Rectangle >()); // OK f 3(new Array. List< Square >()); f 3(new Linked. List< Square >()); ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 // OK Square Förel. 3: Generiska klasser och metoder Nr: 5 20
Exempel 2: Typbegränsning Summering av lista med valfri numerisk elementtyp public static double sum. List(List<? extends Number> number. List) { double sum = 0. 0 d; for ( Number n : number. List ) sum += n. double. Value(); return sum; } Array. List<Long> ll; . . . double d = sum. List(ll); Linked. List<Float> lf; . . . d = sum. List(lf); ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 21
Tillämpningar av begränsningsuttryck u Ofta är det lämpligt att definiera likhets- och relationsoperator för basklassen i en klasshierarki, och sedan låta dessa ärvas till subklasserna. u Ex. equals, compare. To, compare u Typbegränsningsuttryck gör detta möjligt även i kombination med generiska klasser. ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 22
Jämförelseklasser public interface Comparable<T> { int compare. To(T other); } Instanser av klasser som implementerar detta gränssnitt är jämförbara med varandra public interface Comparator<T> { int compare(T lhs, T rhs); } < -1 == 0 > 1 Instanser av klasser som implementerar detta gränssnitt kan jämföra objekt av typ T ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 23
java. lang. Comparable public My. Class implements Comparable<My. Class> { public int compare. To(My. Class x) { compares My. Class objects. . . } + övr. metoder } My. Class obj 1, obj 2; . . . if ( obj 1. compare. To(obj 2) > 0 ). . . ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 24
java. lang. Comparable public class Person Ex. Ordna Person. Implements Comparable<Person> objekt i personnummerordning { private String pnr; . . . public int compare. To(Person other) { return pnr. compare. To(other. pnr); } Delegera jämförelsen till strängklassen (for example). // konstruktor och andra metoder är utelämnade } ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 25
java. util. Comparator public Your. Class { public void your. Method(. . . , Comparator<some type> comp ) {. . . if ( compare(x, y) ==. . . ). . . } + övr. metoder } ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 26
String. Comparator public class String. Comparator implements Comparator<String> { public int compare(String s 1, String s 2) { return s 1. compare. To(s 2); } } Your. Class obj; . . . obj. your. Method(. . . , new String. Comparator()); ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 27
Ex. Storleksjämförelse av figurer Ex. public class Rectangle. Comparator implements Comparator<Rectangle> { public int compare(Rectangle a, Rectangle b) { if ( a. get. Area() < b. get. Area() ) return -1; else if ( a. get. Area() == b. get. Area() ) return 0; else Detta är bara ett bland return 1; flera möjliga sätt att } jämföra rektanglar! } ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 28
Jämförelser och subtyper Ex. Rectangle. Comparator rcomp = new Rectangle. Comparator(); Rectangle r 1 = new Rectangle(5, 4); r 2 = new Rectangle(3, 4); Square sq 1 = new Square(12), sq 2 = new Square(37); rcompare(r 1, r 2); // 1 rcompare(sq 1, sq 2); // -1 Tillåtet eftersom en kvadrat är en rektangel ©Uno Holmer, Chalmers, 2020 -09 -25 18: 03 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 29
En generisk mängdklass (forts. från förel. 1) public interface Generic. Set<T> { void add( T x ); boolean contains( T x ); } ©Uno Holmer, Chalmers, 2020 -09 -25 18: 04 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 30
En generisk ordnad mängdklass public class Generic. Ordered. Set<T> implements Generic. Set<T> { public Generic. Ordered. Set(Comparator<T> comp) public void add(T x) public boolean contains(T x) public int size() … mindre bra men vi återkommer till det! public T get(int i) } Returnerar det i: te elementet i storleksordning ©Uno Holmer, Chalmers, 2020 -09 -25 18: 04 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 31
Mängder av rektanglar Ex. Rectangle. Comparator rcomp = new Rectangle. Comparator(); Generic. Ordered. Set<Rectangle> rect. Set = new Generic. Ordered. Set<Rectangle>(rcomp); rect. Set. add(new Rectangle(5, 4)); rect. Set. add(new Rectangle(2, 3)); rect. Set. add(new Rectangle(3, 4)); // störst // minst // mellan (rect. Set. get(2)). equals(new Rectangle(5, 4)) // true ©Uno Holmer, Chalmers, 2020 -09 -25 18: 04 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 32
Mängder av kvadrater? Rectangle. Comparator rcomp = new Rectangle. Comparator(); TYPFEL! rcomp borde ha typen Comparator<Square> men har typen Comparator<Rectangle> Generic. Ordered. Set<Square> square. Set = new Generic. Ordered. Set<Square>(rcomp); // konstruktorn Generic. Ordered. Set(Comparator<T> comp) ©Uno Holmer, Chalmers, 2020 -09 -25 18: 04 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 33
Typbegränsningsuttrycket <? super T> public class Generic. Ordered. Set<T> implements Generic. Set<T> { private static final int DEFAULT_CAPACITY = 256; private static final int SIZE_INCREMENT = 128; private int capacity = DEFAULT_CAPACITY; // Array capacity private int size = 0; // Number of distinct elements private T[] array; private Comparator<? super T> comp; // konstruktor public Generic. Ordered. Set(Comparator<? super T> comp) {…} public void add(T x) {. . . } public boolean contains(T x) {. . . } public T get(int i) {. . . } } ©Uno Holmer, Chalmers, 2020 -09 -25 18: 04 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 34
Generic. Ordered. Set. contains // Constructor public Generic. Ordered. Set(Comparator<? super T> comp) { this. comp = comp; array = (T[])new Object[capacity]; } public boolean contains(T x) { for ( int i = 0; i < size; i++ ) if ( array[i]. equals(x) ) return true; return false; } ©Uno Holmer, Chalmers, 2020 -09 -25 18: 04 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 35
Generic. Ordered. Set. add public void add( T x ) { if ( this. contains(x) return; if ( size == capacity ) { // buffer full? T[] old = array; // handle to old array // allocate a twice as big array capacity += SIZE_INCREMENT; array = (T[])new Object[capacity]; // copy elements for( int i = 0; i < size; i++ ) array[i] = old[i]; } // insert the new element insert(x); } ©Uno Holmer, Chalmers, 2020 -09 -25 18: 04 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 36
Generic. Ordered. Set. insert private void insert(T x) { // Find the insertion point for x. int i = size; while ( i > 0 && compare(array[i-1], x) > 0 ) { array[i] = array[i-1]; i--; } array[i] = x; // and then insert x size++; } ©Uno Holmer, Chalmers, 2020 -09 -25 18: 04 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 37
Exemplet på bild 32 igen Generic. Ordered. Set<Square> square. Set = new Generic. Ordered. Set<Square>(rcomp); // konstruktorn Generic. Ordered. Set(Comparator<? super T> comp) TYPKORREKT! Comparator<Rectangle> är typkompatibel med Comparator<? super Square> eftersom <? super Square> matchas av Rectangle (se bild 18) ©Uno Holmer, Chalmers, 2020 -09 -25 18: 04 www. cse. chalmers. se/~holmer/ Algoritmer och datastrukturer LET 375, DAI 2+I 2, 18/19, lp 4 Förel. 3: Generiska klasser och metoder Nr: 5 38
- Generisk klass java
- Datatyper och algoritmer
- Datastrukturer och algoritmer
- Datastrukturer och algoritmer liu
- Algoritmer multiplikation
- Frelsning
- Frelsning
- Cassifier
- Rekursiva funktioner
- Træ puzzle løsning
- Likheter skillnader buddhism hinduism
- Konkretia
- Psykisk och fysisk hälsa
- Atomer och molekyler
- Muskelspolar och senspolar
- Planera och genomföra en aktivitet
- Vad är assimilering
- Subjektsform og objektsform
- Det biologiska perspektivet
- Möchten böjning
- Kandidatprogram, fastighet och finans
- Njurloger
- Pronomen substantiv
- Skillnad på stolp och stapeldiagram
- Jordens yttre krafter
- Stressrelaterade sjukdomar
- Induktion och deduktion
- Klassens frånvaro rim
- Othello och ibn rushd
- Losus
- Pionärer
- årshjul idrott och hälsa
- Inkomster och utgifter
- Flerhjärtbladiga växter
- Sca jakt och fiske
- Ledarskapsteorier
- Ingrupp och utgrupp
- Presens och imperfekt
- Tieto teis