Algoritmer och datastrukturer Frelsning 3 Generiska klasser och

  • Slides: 38
Download presentation
Algoritmer och datastrukturer Föreläsning 3 Generiska klasser och metoder (Weiss kap. 4. 7 -8,

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

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;

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 =

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 =

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;

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

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

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

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

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

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

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

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

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

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

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());

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

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 >

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.

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.

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

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

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.

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

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(. . . ,

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

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

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(

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

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>

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

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

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

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.

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

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.

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