Objektorienterad programmering med Java, Generics

Relevanta dokument
DAT043 - föreläsning 8

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

Objektorienterad programmering i Java

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

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

Arrayer. results

Generiska konstruktioner. Kursbokens kapitel 13

Generisk klass med typparameter Inre klass - ListIterator

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

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

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

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

Sammansatta datatyper Generics: Parametrisk polymorfism

Lösningar för tenta 3 DAT043,

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

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

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

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

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

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

Repetition av OOP- och Javabegrepp

DAT043 Objektorienterad Programmering

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

Föreläsning 2 Datastrukturer (DAT037)

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

Repetition av OOP- och Javabegrepp

Föreläsning 4 Innehåll

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

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

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

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

Laboration A Objektsamlingar

OOP Objekt-orienterad programmering

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

Föreläsning 2, vecka 8: Repetition

Föreläsning 2. Länkad lista och iterator

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

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

OOP Objekt-orienterad programmering

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Sammansatta datatyper Generics: Parametrisk polymorfism

Classes och Interfaces, Objects och References, Initialization

DAT043 - Föreläsning 7

Samlingar, Gränssitt och Programkonstruktion! Förelasning 11!! TDA540 Objektorienterad Programmering!

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

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

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

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

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

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

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

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

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Introduktion till arv

Objektorienterad Programmering (TDDC77)

Laboration 13, Arrayer och objekt

Föreläsning 2 Datastrukturer (DAT037)

ID1004 Laboration 4, November 2012

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Föreläsning 1. Abstrakta datatyper, listor och effektivitet

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

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Listor. Koffman & Wolfgang kapitel 2, avsnitt , och 2.9

Lösningar för tenta 2 DAT043,

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

Kopiering av objekt i Java

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Föreläsning 13 Innehåll

Generiska datatyper. Parametrisk Polymorfism: Generics. Generisk lista. Utvikning: Typer

Föreläsning 3 Innehåll

Föreläsning 2. Länkad lista och iterator

Diskutera Sortera objekt

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

Föreläsning 2 Innehåll

Sökning och sortering

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

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

LÖSNINGSFÖRSLAG

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Föreläsning 6: Metoder och fält (arrays)

Objektorienterad programmering E. Algoritmer. Telefonboken, påminnelse (och litet tillägg), 1. Telefonboken, påminnelse (och litet tillägg), 2

OOP Objekt-orienterad programmering

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

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

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Relationer mellan objekt

Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2

Länkade strukturer. (del 2)

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

Föreläsning 2 Innehåll

Tommy Färnqvist, IDA, Linköpings universitet

Kapitel 6. Hakparenteser fšr att ange index MŒnga všrden av samma typ

Tentamen, EDAA20/EDA501 Programmering

Transkript:

Generics i Java Generic: allmän, genersisk. På menyn på en asiatisk restaurang: Denna rätt serveras med valfritt kött, fisk eller skalddjur Bakgrund Generics i Java ger oss att skriva kod, klasser och metoder, där vi kan välja vilka typer som ska ingå först när metoden anropas eller klasssen insatansieras och samtidigt göra detta på ett typsäkert sätt. Ett av många exempel då vi har nytta av generics är när vi ska skriva en klass för att lagra samlingar av objekt. Exempel, en lista En klass för att lagra texter, String-objekt, skulle kunna se ut så här: public class ListOfStrings { private String[] thelist; private int noofelements; public ListOfStrings() { thelist = new String[10]; noofelements = 0; public void addstring(string s) { public String getstring(int index) { Ett objekt av denna typ kan endast lagra String-objekt (eller objekt av subtyp till String). Vill vi lagra objekt av annan typ måste vi skriva en ny version av klassen, även om det enda vi ändrar är typen på det som lagras. Om vi istället använder oss av referenser till Javas supertyp, Object, kan objekt av vilken typ som helst lagras i listan eftersom en referens av supertyp får referera objekt av subtyp 1. public class ListOfObjects { private Object[] thelist; private int noofelements; public ListOfObjects() { thelist = new Object[10]; noofelements = 0; public void addobject(object o) { public Object getobject(int index) { Vi skapar en lista och adderar objekt. Observera att vi nu kan lägga till olika typer av objekt i en och samma lista. ListOfObjects list = new ListOfObjects(); list.addobject(new String("Forty-two")); 1 Det var denna teknik som tidigare användes i Javas Collections Framework. Anders Lindström 1 KTH STH

list.addobject(new Integer(42)); Så långt så väl, men när vi nu hämtar objekten måste vi veta vad det är för typ av objekt, och göra en down-cast av referenstypen. String s = (String) list.getobject(0); Integer i = (Integer) list.getobject(1); Programmeraren måste veta typen på objekten och göra en korrekt typomvandling. Problemet är att kontroll av om referenstyper används korrekt visserligen sker vid kompileringen men att kontrollen av huruvida det refererade objektet är av rätt typ sker först vid exekvering, run-time. Det finns alltså ingen möjlighet för kompilatorn att avgöra om det objekt som returneras av metoden är av en typ som matchar typomvandlingen. En generisk lista Det bästa vore om man vid skapandet av listan kunde ange vilken typ som ska lagras i listan, så att kompilatorn kan göra en korrekt kontroll av typerna, och så att vi slipper s.k. down-casts. Det är detta generics i Java hjälper oss med. List<String> list = new List<String>(); list.add(new String("Forty-two")); String s = list.get(0); Namnet som anges inom <> är en typ, den typ som listan ska kunna lagra. Vi behöver här inte göra några typomvandlingar, metoden get returnerar referenser av typen String i vårt fall. Det är nu möjligt för kompilatorn göra typkontroller. Följande sats innebär, för den lista för Stringobjekt vi deklarerat ovan, ett syntaxfel. list.add(new Integer(42)); //Fel, argumentet måste nu vara av typen String! List-klassen skrivs en gång för alla, och kan sedan instansieras för att lagra olika typer av objekt vid olika tillfällen. Vi ska nu studera hur man kan skriva en sådan klass med hjälp av generics. Anders Lindström 2 KTH STH

Syntax När vi skriver en generisk klass eller metod anger vi en eller flera typparametrar, t.ex. <T, U>. Det är en oskriven regel att man använder stora bokstäver för typparametrar. När klassen sedan instansieras anges vilka typer som ska användas istället för typparametern för just detta objekt, t.ex. <String, Integer>. Exempel på en generisk klass Klassen DataSample ska internt lagra någon form av data, av godtycklig typ. Vi deklarerar klassen med en typparameter, T, som representerar den ännu okända typen på datat. public class DataSample<T> { private T thedata; public DataSample(T thedata) { this.thedata = thedata; public T getdata() { return thedata; public String tostring() { return thedata.tostring(); Vi kan sedan instansiera klassen och då ersätta typparametern med en verklig typ. Notera att den verkliga typ som ersätter typparametern anges både för referensen och för objektet som skapas. DataSample<String> dss = new DataSample<String>("Forty-two"); String s = dss.getdata(); DataSample<Integer> dsi = new DataSample<Integer>(42); int i = dsi.getdata(); En typparameter som deklareras som T ovan har en räckvidd som motsvarar hela den aktuella klassen. Exempel på en generisk metod Man kan också ange typparametrar för enskilda metoder. Räckvidden för typparametern är då naturligtvis endast aktuell metod. Metoden nedan returnerar det mittersta elementet i en array av godtycklig typ. public static <T> T getmiddleelement(t[] arr) { return arr[arr.length/2]; Metoden anropas så här. String[] words = {"C#", "Android", "Java Micro Edition"; String middle = GenericMethods.<String>getMiddleElement(words); Anders Lindström 3 KTH STH

Begränsade typparametrar (bounds for type parameters) Det finns situationer då man vill begränsa de typer en genrisk klass eller metod ska kunna instansieras för. Om man till exempel vill skriva en generisk kod som bara får instansieras för subtyper till Shape (Line, Circle, ) kan typparametern deklareras <T extends Shape>. Kompilatorn kommer att signalera ett fel om T ersätts av en typ som inte uppfyller villkoret. Vi exemplifierar med en generisk sorteringsmetod, som kan sortera vilken typ av objekt som helst, bara typen implementerar interfacet java.lang.comparable 2. Så här ser sorteringsmetoden ut. public static <T extends Comparable<T>> void sortobjects(t[] arr) { int minindex; T temp; for(int i = 0; i < arr.length - 1; i++) { minindex = i; for(int j = i + 1; j < arr.length; j++) { if(arr[j].compareto(arr[minindex]) < 0) { // compare minindex = j; // Swap temp = arr[i]; arr[i] = arr[minindex]; arr[minindex] = temp; I detta fall kompliceras bilden något av att interfacet java.lang.comparable i sig är generiskt. Deklarationen av interfacet är deklarerat som nedan (T ska anges till samma typ som implementerande klassen, t.ex. i klassen String ska argumentet other vara av typen String). public interface Comparable<T> { abstract public int compareto(t other); Det extra T:et i T extends Comparable<T>> står alltså för att samma typ som metoden sortobjects instansieras för ska användas i interfacet Comparable. Bakom kulisserna i Java När man i Java kompilerar en generisk klass genereras endast en version av kompilerad kod, oavsett hur många olika typer den sedan kommer att instansieras för. Den kompilerade koden innehåller, på de ställen en typparameter refereras i källkoden, referenser till Javas supertyp Object. I Java är alltså generics inte en del av den kompilerade koden utan bara ett sätt möjliggöra för kompilatorn att kontrollera att källkoden är korrekt vad gäller ingående typer, samt naturligtvis att undvika down-casts (som ju är potentiella felkällor och dessutom irriterande). 2 Detta anges som T extends Comparable eftersom typen är att anse som en subtyp till Comparable. Anders Lindström 4 KTH STH

I Språket C++ är förvisso syntaxen för generisk kod liknande den i Java, men kompileringen sker på helt annat sätt 3. I C++ genereras nämligen separat maskinkod för varje separat typ som den generiska koden instansieras för. Detta är ett helt annat sätt att implementera generics än det sätt man valt i språket Java. En generisk klass för en kö Vi kan nu förbättra den kö-klass som du tidigare implementerat i en laboration. Klassen ska kunna instansieras för godtycklig typ. public class Queue<T> { private T[] queue; private int noofelements; public Queue(int size) { queue = (T[]) new Object[size]; noofelements = 0; /** Add an object to the end of the queue. */ public void add(t element) { if(noofelements >= queue.length) { this.resize(); queue[noofelements++] = element; /** Remove the head of the queue. */ public T remove() throws EmptyQueueException { if(noofelements <= 0) throw new EmptyQueueException(); T temp = queue[0]; this.pack(0); return temp; Notera att man i Java inte kan skapa en array av godtycklig typ via en typparameter. Istället får man skapa en array av typen Object (ja just det) och göra ett down-cast. Detta görs internt i kö-klassen (i detta fall i konstruktorn) och syns inte för användaren av klassen. Anledningen att till att just arrayer inte kan skapas via typparametrar ligger utanför denna introduktion, vill du fördjupa dig i detta rekommenderar jag att studerar någon av referenserna nedan. Alla klasser i Javas Collections Framework är implemeterade genersikt (sedan version 1.5). 3 I C++ används beteckningen template (mall) för generics. Anders Lindström 5 KTH STH

Läsa mer om generics Ortacles tutorial om generics i Java: http://docs.oracle.com/javase/tutorial/java/generics/ Anders Lindström 6 KTH STH