Generisk klass med typparameter Inre klass - ListIterator

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

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

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

Kopiering av objekt i Java

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

Föreläsning 3. Stack

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

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

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

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

Föreläsning 10. ADT:er och datastrukturer

DAT043 - föreläsning 8

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

/* * * Lösningsförslag tentamen DIT950 * Datum * */ /* * -1 - */ För samtliga gäller,se föreläsningsanteckningar.

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

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

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

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

Tentamen Programmering fortsättningskurs DIT950

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

Arrayer. results

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

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

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

Föreläsning 4 Innehåll

Föreläsning 3. Stack

Objektorienterad Programkonstruktion. Föreläsning jan 2016

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

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

Länkade strukturer. (del 2)

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

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

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

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

Konstruktion av klasser med klasser

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

Laboration A Objektsamlingar

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

Objektorienterad programmering med Java, Generics

Lösningsförslag till tentamen i OOP, HI1027 Fredag 21 oktober 2011

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

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

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

TENTAMEN: Objektorienterad programmering. Läs detta! Skriv din tentamenskod på varje blad (så att vi inte slarvar bort dem).

Laboration 13, Arrayer och objekt

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

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

Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

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

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

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

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

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

Länkade strukturer, parametriserade typer och undantag

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

TENTAMEN OOP

Klasshierarkier. Klasser kan byggas på redan definierade klasser

Objektorienterad Programmering (TDDC77)

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

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

Classes och Interfaces, Objects och References, Initialization

Föreläsning 8: Exempel och problemlösning

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

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

Objektorienterad Programmering (TDDC77)

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

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

Tentamen Objekt-orienterad programmering med Java, 1DL100 Sommarkurs och distanskurs

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Stackar, köer, iteratorer och paket

Objektorienterade programmeringsspråk. Objektorienterade språk. Den objekt-orienterade modellen. Jämför med icke-oo

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

Laboration 1 - Grunderna för OOP i Java

Övning vecka 5. Denna vecka ska vi titta pa samlingar, generics och designmönstren Decorator, Singleton och Iterator.

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

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

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

Outline. Objektorienterad Programmering (TDDC77) Abstrakta klasser. Abstrakta metoder. Abstrakta klasser. Gränssnitt. Uppräkningar (enum) Ahmed Rezine

Objektorienterad Programmering (TDDC77)

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 5

JAVA Mer om klasser och objektorientering

Tentamen OOP

Tentamen Objekt-orienterad programmering i Java, 5p distanskurs

LÖSNINGSFÖRSLAG

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

TENTAMEN OOP

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

LÖSNINGSFÖRSLAG TENTAMEN

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

F4. programmeringsteknik och Matlab

Att skriva till och läsa från terminalfönstret

Lösningar för tenta 3 DAT043,

Sammansatta datatyper Generics: Parametrisk polymorfism

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

Parallellism, återblick

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

Transkript:

Objektorienterad programmeringsmetodik Generics, clone Generics Återanvändning Ännu ett sätt att lösa ett gammalt problem: skriva så lite kod som möjligt Vi vill ha metoder som fungerar på olika klasser Hur implementerar vi då egna generiska klasser/metoder? Vi vill egentligen ha: Lista av heltal Lista av strängar Lista av... Lista av våra egna objekt Återanvända algoritmer för olika datatyper 3 4 Generisk klass med typparameter Inre klass - ListIterator import java.util.iterator; public class GenericList<T> implements Iterable<T> // Element is an inner class that contains values of type K private class Element<K> private K value; private Element<K> next; public Element() value=null; next=null;... 5 // The (inner class) ListIterator is used to iterate over elements<t> private class ListIterator implements Iterator<T> Element next; public ListIterator(Element first) next=first; public boolean hasnext() return next.next()!=null; public void remove() throw new UnsupportedOperationException(); public T next() next=next.next(); return next.value(); 6 1

GenericList GenericList // First element in the generic list private Element<T> first; public GenericList() first = new Element<T>(); public boolean isend(element<t> elem) return elem.next() == null; public Element<T> first() return first; public Element<T> next(element<t> elem) return elem.next(); public T inspect(element<t> elem) return (T) elem.next().value(); public void insert(t value, Element<T> elem) Element<T> newelem=new Element<T>(value, elem.next()); elem.setnext(newelem); public void remove(element<t> elem) elem.setnext(elem.next().next()); public Iterator<T> iterator() return new ListIterator(first); 7 8 Testkod // Test code public static void main(string[] args) GenericList<Integer> intlist=new GenericList<Integer>(); intlist.insert(1, intlist.first()); intlist.insert(2, intlist.first()); intlist.insert(3, intlist.first()); intlist.insert(4, intlist.first()); for(int i:intlist) System.out.println(i); Generisk metod med typparameter static <T> void arraytocollection(t[] arr, Collection<T> coll) for (T obj : arr) coll.add(obj); // Correct GenericList<String> stringlist = new GenericList<String>(); stringlist.insert("text 1", stringlist.first()); stringlist.insert("text 2", stringlist.first()); for(string i : stringlist) System.out.println(i); 9 10 Problem med typkonvertering public static void main(string[] args) GenericList<String> s1 = new GenericList<String>(); s1.insert(new String( hej ), s1.first()); String s = s1.inspect(s1.first()); Kod som fungerar på alla generiska klasser? Till exempel skriva ut alla saker i listan GenericList<Object> o1 = new GenericList<Object>(); GenericList<Object> o2 = s1; Type mismatch: cannot convert from GenericList<String> to GenericList<Object> 11 12 2

Innan generics import java.util.linkedlist; import java.util.list; public class Demo4b public static void main( String argv[] ) LinkedList l = new LinkedList(); import java.util.linkedlist; import java.util.list; Nu public class Demo4b public static void main( String argv[] ) LinkedList<String> l = new LinkedList<String>(); public static void printstuff( List sl ) while(!sl.isempty() ) System.out.println( o ); 13 public static void printstuff( List<Object> sl ) while(!sl.isempty() ) Demo4b.java:9: printstuff(java.util.list<java.lang.object>) in Demo4b cannot be applied to System.out.println( o ); (java.util.linkedlist<java.lang.string>) ^ 1 error 14 Vilken lista som helst -? Problem public class Demo4b public static void main( String argv[] ) LinkedList<String> l = new LinkedList<String>(); Kompilatorn kan inte garantera vilken typ o är public static void printstuff( List<?> sl ) while(!sl.isempty() ) System.out.println( o ); Typen för sl är okänd men tilldelas till en String 15 16 Specifikt för vissa klasser Problem för andra listor Man vill göra något med listor av grafiska objekt Vad skall dousefulshapestuff göra med en String? 17 18 3

Begränsa typen Åt andra hållet Ta bara emot listor med Shape och subtyper Det går även att begränsa en Generisk typ åt andra hållet Görs mha super TreeSet(Comparator<? super E> c)? svarar i detta fall mot en godtycklig superklass till E 19 20 Generiska arrayer Värt att veta Java tillåter inte skapandet av arrayer av generisk typ Exvis public class Stack<E> private E[] data = new E[10];... är ej tillåtet Lösningen: Skapa en array av Objects och typkonvertera denna public class Stack<E> private E[] data = (E[]) (new Object[10]);... Fast det genererar en varning från kompilatorn :-( 21 Alla instanser av en generisk klass delar samma kod En del andra språk kompilerar upp en ny version av koden för varje instans av den generiska klassen (och ibland värre än så!!) 22 Generics i Java 7 Klona objekt En ny Diamant operator List<String> list = new LinkedList<>(); I detta fall så kommer java att för konstruktorn göra ett antagande att det är LinkedList<String>(); som ska köras. Diamantoperatorn kan användas så länge som Java kan lista ut vilken typ som menas i sammanhanget. Följande funkar tex inte: List<String> list = new ArrayList<>(); list.add("a"); list.addall(new ArrayList<>()); Göra en kopia av ett objekt Definerad i Object protected Object clone() throws CloneNotSupportedException Kan behöva implementeras i din klass Eftersom addall i detta fall förväntar sig en collection som innehåller en String eller en subklass till den (och inte kan avgöra typen). 23 24 4

Grund/djup Grund kopia Grund SomeClass Djup OtherClass SomeClass SomeClass OtherClass SomeClass OtherClass En egen clone-metod, i detta fall anropar den bara basklassens metod public class SomeClass implements java.lang.cloneable private OtherClass oc; public Object clone( ) throws java.lang.clonenotsupportedexception return super.clone(); Obs Cloneable-interfacet 25 26 Djup kopia Klonbara objekt I detta fall måste metoden själv kopiera den information som skall följa med public class SomeClass implements java.lang.cloneable private OtherClass oc; // detta måste också as! public Object clone( ) throws java.lang.clonenotsupportedexception SomeClass sc = (SomeClass) super.clone(); sc.oc = (OtherClass) oc.clone(); return sc; Implementera java.lang.cloneable Undantaget java.lang.clonenotsupportedexception kastas om man anropar Object.clone() för ett objekt som inte implementerar Clonable-interfacet clone i Object är definierad protected men man brukar omdefiniera den med en public clone metod Klona attribut som är objekt Klona inte objekt som är immutable Anropa super.clone för att a föräldraobjekts parametrar (och för att objects clone() ska ta hand om primitiva typer och referenser) 27 28 5