Begreppet subtyp/supertyp i Java. Mera om generik. Generik och arv. Generik och arv. Innehåll

Relevanta dokument
Mera om generik. Innehåll. Generik och arv Wildcards Vektorer och generik Generiska metoder. EDA690 (Mera om generik) HT / 24

DAT043 - föreläsning 8

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Seminarium 3 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Seminarium 2 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Objektorienterad programmering med Java, Generics

Föreläsning 9. Generiska enheter Inre klasser Anonyma klasser Kloning

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 6 Innehåll. Rekursion. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursiv problemlösning. Rekursion. Rekursivt tänkande:

Föreläsning 9 Innehåll

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Generisk klass med typparameter Inre klass - ListIterator

Föreläsning 13 Innehåll

Subtyping, co- och contra-variance. Objekt-orienterad programmering och design Alex Gerdes, 2016

Generics och polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

Generics och polymorfism. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 12 Innehåll

Algoriter och Datastrukturer (ALDA/ID005)

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Repetition av viktiga begrepp inom objektorienterad programmering

Föreläsning 11 Innehåll. Diskutera. Binära sökträd Definition. Inordertraversering av binära sökträd

Typhierarkier del 1 Gränssnitt, ärvning mellan gränssnitt, ärvning mellan klasser

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

1 Repetition av viktiga begrepp inom objektorienterad programmering

Subtyping och variance. Objekt-orienterad programmering och design Alex Gerdes, 2018

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

Uno Holmer, Chalmers, :17 Uno Holmer, Chalmers, :17

Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Föreläsning 10 Innehåll. Diskutera. Inordertraversering av binära sökträd. Binära sökträd Definition

Föreläsning 10 Innehåll

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Generiska konstruktioner. Kursbokens kapitel 13

Föreläsning 3 Innehåll

Diskutera Sortera objekt

Sammansatta datatyper Generics: Parametrisk polymorfism

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design Alex Gerdes, 2016

Klasshierarkier - repetition

Mål Förklaring av termer

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

Mål Förklaring av termer

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

Objektorienterad Programmering (TDDC77)

Konstruktion av klasser med klasser

DAT043 - Föreläsning 7

Subtyping, co- och contra-variance. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016 Johannes Åman Pohjola, 2017

Föreläsning REPETITION & EXTENTA

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 2 Innehåll

DAT043 Objektorienterad Programmering

UML. Översikt UML. Relationer mellan klasser. A är ett aggregerat av B:n. Kontor aggregat av Enheter. 12 olika diagramtyper, bl.a.

OOP Objekt-orienterad programmering

Laboration 13, Arrayer och objekt

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

Repetition av OOP- och Javabegrepp

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

OOMPA 2D1359 Föreläsning 8

Klasshierarkier. Klasser kan byggas på redan definierade klasser

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

Repetition av OOP- och Javabegrepp

Föreläsning 2 Innehåll

Java Collections Framework. Föreläsning 2 Innehåll. Java Collections Framework interface hierarki. Java Collections Framework interface hierarki

Outline. Objektorienterad Programmering (TDDC77) Åsidosättning. Signatur. Åsidosättning. Abstrakta klasser. Ahmed Rezine.

Java Collections Framework. Föreläsning 2 Innehåll. Java Collections Framework interface hierarki. Java Collections Framework interface hierarki

TDDE10 TDDE11, 725G90. Objektorienterad programmering i Java, Föreläsning 3 Erik Nilsson, Institutionen för Datavetenskap, LiU

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 7/ Exempel: Implementation av Schackpjäser.

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Föreläsning 2 Innehåll. Generiska klasser. Generik i Java. Varför generiska klasser Bakgrund

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Arv innebär att man skapar en ny klass (subklass) utifrån en redan existerande klass (superklass, basklass).

Generic type declarations. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Sammansatta datatyper Generics: Parametrisk polymorfism

Föreläsning 3-4 Innehåll

OOP Objekt-orienterad programmering

public interface Skrivbar { void skriv(); } public class Punkt implements Skrivbar { public double x; public double y;

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 14

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 31/ Exempel: Implementation av Schackpjäser.

Arrayer. results

Grundläggande termer. Några olika system. F11 Grunderna i Versionshantering. Git basic. Origin. Git basic. Git basic. Local #1. Local #3.

Lösningar för tenta 3 DAT043,

Kopiering av objekt i Java

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?

Outline. Objektorienterad Programmering (TDDC77) Att instansiera en klass. Objekt. Instansiering. Åtkomst. Abstrakt datatyp.

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

EDAA30 Programmering i Java - fortsättningskurs

Typecasting - primitiva typer. Innehåll. DoME klasser

Classes och Interfaces, Objects och References, Initialization

Föreläsningsmaterial (Arv) Skrivet av Andreas Lund

Föreläsning 4 Innehåll

Objektorienterad Programkonstruktion, DD1346 FACIT. Tentamen , kl

Transkript:

Mera om generik Begreppet subtyp/supertyp i Java Innehåll Wildcards Vektorer och generik Supertyper för en viss klass C är alla klasser från vilka C ärver och alla interface som klassen implementerar. C är subtyp till alla sina supertyper. Exempel: class A {... class B extends A {... interface I {... class C extends B implements I{... C är här subtyp till B, A och I (och Object) B är subtyp till A (och Object) EDAA01 (Mera om generik) VT 2016 1 / 24 EDAA01 (Mera om generik) VT 2016 2 / 24 Antag att vi har en generisk klass G<E> och att vi har två klasser class Person... class Student extends Person... Det gäller då inte att G<Student> är subtyp till G<Person>. Varför? LinkedList<Student> ls = new LinkedList<Student>(); LinkedList<Person> lp = ls; // fel! lp.add(new Person(...)); Tilldelningen på rad 2 hade varit tillåten om LinkedList<Student> vore subklass till LinkedList<Person>. Vi kan då (som på rad 3) sätta in Person-objekt i listan ls (eftersom lp refererar till samma listobjekt som ls). När vi skapar listan ls på rad 1 är avsikten att säkerställa att enbart objekt av typen Student eller subklasser av denna skall kunna sättas in. Således ingen typsäkerhet längre. Därför är rad 2 illegal och ger kompileringsfel! EDAA01 (Mera om generik) VT 2016 3 / 24 EDAA01 (Mera om generik) VT 2016 4 / 24

raw type Antag att vi har en generisk klass class G<T,U,V>. Klassens grundtyp (eng: raw type) definieras då som G. T ex är LinkedList grundtyp för LinkedList<E>. Variabler som deklarerats med en viss grundtyp kan tilldelas värden som är vilken som helst av den parametriserade klassens instanser. Ex: LinkedList mylist = new LinkedList<Integer>(); mylist = new LinkedList<String>(); Om S är subtyp till T och G är en generisk klass så gäller det inte att G<S> är subtyp till G<T>. En parametriserad typ G1 är subtyp till en annan parametriserad typ G2 om och endast om G1 och G2 har identiska värden på parametrarna. R1 är subtyp till R2 där R1 är grundtyp för G1 och R2 är grundtyp för G2. Ex: LinkedList<Integer> är subtyp till Collection<Integer>. LinkedList<Integer> är inte subtyp till LinkedList<Object>. EDAA01 (Mera om generik) VT 2016 5 / 24 EDAA01 (Mera om generik) VT 2016 6 / 24 Wildcards Försök att skriva en metod som skriver ut innehållet i en samling av godtycklig typ i Java 5.0: public static void printcollection(collection<object> c) { for (Object e: c) { System.out.println(e); Kan dock enbart anropas med en parameter som är subklass till Collection<Object> t ex LinkedList<Object> Kan inte anropas med t ex en parameter av typen LinkedList<String> Lösningen på problemet är att använda s.k. wildcards. Collection<?> är superklass till Collection<E> för alla E.? är wildcard. Collection<?> är en collection of unknown. Vi kan nu implementera vår metod i java 5.0: public static void printcollection(collection<?> c) { for (Object e: c) { System.out.println(e); Nu kan metoden anropas med objekt av godtycklig collection-klass t ex Collection<Object> eller LinkedList<String>. EDAA01 (Mera om generik) VT 2016 7 / 24 EDAA01 (Mera om generik) VT 2016 8 / 24

Wildcards Typparametrar med begränsningar Man kan också deklarera variabler av parametriserad typ med hjälp av wildcards: Collection<?> mycollection = new LinkedList<String>(); Men man kan inte använda en sådan variabel för att lägga in element i samlingen: mycollection.add(..) // fel!! Ibland behöver man ange begränsning på typparmetern till en generisk klass: public class ASortedCollection<E extends Comparable<E>> Typparametern <E extends T> betyder att E måste vara subklass till T om T är en klass. Det är också tillåtet att E = T. E måste implementera interfacet T om T är ett interface. I exemplet ovan anger vi alltså att E måste vara en typ som implementerar interfacet Comparable<E>. Vi kan därmed använda metoden compareto på objekt av typen E i implementationen av ASortedCollection. EDAA01 (Mera om generik) VT 2016 9 / 24 EDAA01 (Mera om generik) VT 2016 10 / 24 Typparametrar med begränsningar Följande är ok, Integer implementerar Comparable: ASortedCollection c = new ASortedCollection<Integer>(); Följande är ok, String implementerar Comparable: ASortedCollection c = new ASortedCollection<String>(); Följande är ok, om Person implementerar Comparable, annars kompileringsfel: ASortedCollection c = new ASortedCollection<Person>(); Utgå från följande klasshierarki: public abstract class Shape { public abstract void draw(); public class Circle extends Shape { public void draw() {... public class Rectangle extends Shape { public void draw() {... Vi vill skriva en metod som ritar alla element som finns i en lista av Shape-objekt. Ett första försök på nästa bild. EDAA01 (Mera om generik) VT 2016 11 / 24 EDAA01 (Mera om generik) VT 2016 12 / 24

public static void drawall(linkedlist<shape> shapes) { for (Shape s: shapes) { s.draw(); Denna metod kan dock inte anropas med en parameter av typ LinkedList<Circle> t.ex mylist: LinkedList<Circle> mylist = new LinkedList<Circle>(); ty LinkedList<Circle> är inte subklass till LinkedList<Shape>. Genom följande utformning accepterar metoden listor av typ LinkedList<Shape>, LinkedList<Circle> eller LinkedList<Rectangle>: public static void drawall(linkedlist<? extends Shape> shapes) { for (Shape s: shapes) { s.draw(); <? extends E> är exempel på wildcard med begränsning. <? extends E> kan utläsas: okänd subklass till E. Detta inkluderar E. EDAA01 (Mera om generik) VT 2016 13 / 24 EDAA01 (Mera om generik) VT 2016 14 / 24 <? extends E> är exempel på wildcard med övre gräns. Det finns också användning för wildcard med undre gräns:<? super E>. <? super E> kan utläsas som okänd superklass till E". Detta inkluderar E. Exempel på användning på följande två bilder: Ibland vill man uttrycka att en typpparameter E står för en typ som har jämförelseoperationer definierade d.v.s. implementerar interfacet Comparable. Ex. Sorterad lista. En första ansats: public class SortedList<E extends Comparable<E>> {... EDAA01 (Mera om generik) VT 2016 15 / 24 EDAA01 (Mera om generik) VT 2016 16 / 24

Ofta för restriktivt att kräva att E implementerar Comparable<E>. Ex. class Person implements Comparable<Person> {... class Student extends Person {... Nu kan vi inte skapa en sorterad lista för studenter (trots att studenter går att jämföra med varandra): SortedList<Student> list = new SortedList<Student>(); eftersom Student inte implementerar Comparable<Student>. Genom att i stället ge klassen följande utformning public class SortedList<E extends Comparable<? super E>> blir det möjligt att skapa en sorterad lista med studenter: SortedList<Student> list = new SortedList<Student>(); (*) E extends Comparable<? super E> kan utläsas E implementerar interfacet Comparable<T> där T är en okänd superklass till E (vilket inkluderar E). Student implementerar Comparable<Person> och Person är superklass till Student. Därför är (*) nu korrekt EDAA01 (Mera om generik) VT 2016 17 / 24 EDAA01 (Mera om generik) VT 2016 18 / 24 Vektorer och generik Vektorer och generik Man kan deklarera vektorer med typparameter som elementtyp. Man kan dock inte skapa vektorer där elementtypen är en typparameter. public class MyStack<E> { E[] contents; // OK att deklarera! public Stack() { contents = new E[100]; // men kompileringfel här!... I exemplet med klassen MyStack kan man göra så här: public class MyStack<E> { E[] contents; public Stack() { contents = (E[]) new Object[100];... Vilket dock ger en varning av kompilatorn! EDAA01 (Mera om generik) VT 2016 19 / 24 EDAA01 (Mera om generik) VT 2016 20 / 24

Vektorer och generik Även metoder kan ha typpparametrar: Man kan inte skapa en vektor där elementen är en parametriserad typ: LinkedList<String>[] a; // OK att deklarera a = new LinkedList<String>[10]; // fel att skapa! Obegränsade wildcards dock OK: LinkedList<?>[] a = new LinkedList<?>[10]; public class Utilities { /* Fyller alla platser i a med elementet x */ public static <T> void fill(t[] a, T x) { for (int i = 0; i < a.length; i++) { a[i] = x;... Typparameter (en eller flera) anges inom < och > före metodens returtyp. EDAA01 (Mera om generik) VT 2016 21 / 24 EDAA01 (Mera om generik) VT 2016 22 / 24 kan anropas utan att man explicit anger vad typen T är: Utilities.fill(new Integer[10], new Integer(3)); Utilities.fill(new String[5], new String("abc")); För det första anropet fastställer kompilatorn typen T till Integer och i det andra till String. Antag att vi har en klass Student: Student extends Person{... Det är då möjligt att anropa metoden enligt: Utilities.fill(new Person[10], new Student()); Kompilatorn fastställer här T till att vara Person (gemensam superklass till Person och Student som gör anropat legalt). EDAA01 (Mera om generik) VT 2016 23 / 24 EDAA01 (Mera om generik) VT 2016 24 / 24