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

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

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

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

Classes och Interfaces, Objects och References, Initialization

Static vs Dynamic binding Override vs Overload. Objekt-orienterad programmering och design Alex Gerdes och Sólrún Halla Einarsdóttir, 2018

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

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

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

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

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

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

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Sammansatta datatyper Generics: Parametrisk polymorfism

Arrayer. results

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

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

TDA550 Objektorienterad programmering, fortsättningskurs. Föreläsning 1. Introduktion Variabler och typer

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

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

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

Typecasting - primitiva typer. Innehåll. DoME klasser

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

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

DAT043 - föreläsning 8

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

Lambdas. (och fler design patterns) Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

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

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

Objektorienterad programmering Föreläsning 10. Copyright Mahmud Al Hakim Sorteringsalgoritmer

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

Objektorienterad programmering med Java, Generics

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

Sammansatta datatyper Generics: Parametrisk polymorfism

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

OOP Objekt-orienterad programmering

DAT043 - Föreläsning 7

F4. programmeringsteknik och Matlab

Kopiering av objekt i Java

F7 - Arrayer. ID1004 Objektorienterad programmering Fredrik Kilander

Repetition av OOP- och Javabegrepp

Tentamen ID1004 Objektorienterad programmering October 29, 2013

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

Repetition av OOP- och Javabegrepp

Föreläsning 2, vecka 8: Repetition

TDA550 - Objektorienterad programvaruutveckling, fk

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

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

Typkonvertering. Java versus C

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

Principles of subclasses. Objekt-orienterad programmering och design Alex Gerdes, 2018

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

Objekt, klasser. Tillstånd Signatur Kommunikation Typ. Fält, parametrar och lokala variabler. Konstruktorer Metoder DAVA15

OOP Objekt-orienterad programmering

Lösningar för tenta 3 DAT043,

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Objekt-orienterad Programmering och Design. TDA552 Alex Gerdes, HT-2018

Objektorienterad programmering Föreläsning 9. Copyright Mahmud Al Hakim Agenda (halvdag)

Objekt-orienterad programmering och design. DIT953 Niklas Broberg, 2018

Anteckningar 1: Grundläggande saker

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

Objekt-orienterad Programmering och Design. TDA551 Alex Gerdes, HT-2016

TDDD78 Objektorientering i Java, del 2

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

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

Övning2. Variabler. Data typer

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

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

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

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

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

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

I STONE. I Variabler, datatyper, typkonvertering. I Logiska och matematiska uttryck. I Metoder-returvärde och parametrar. I Villkorssatser if/else

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

OOP Objekt-orienterad programmering

Föreläsning 13 Innehåll

Klasser i Java kan ha metoder och egenskaper. Metoder beskriver funktioner som klassen kan utföra. Egenskaper beskriver innehållet i klassen.

Lektion 7. Datateknik A, Java I, 5 poäng

"Är en"-relation. "Har en"-relation. Arv. Seminarium 2 Relevanta uppgifter. I exemplet Boll från förra föreläsningen gällde

Objektorienterad Programmering (TDDC77)

Föreläsning REPETITION & EXTENTA

Innehåll. 1 Kort om dynamisk polymorfism. 2 Arv i C++ 3 Multipelt arv. 4 Något om statisk polymorfism. class Container {

Föreläsning Innehåll. Hantera många element. Exempel: polygon Godtyckligt antal element. Exempel: polygon forts

Arrayer (fält)

Objektorienterad Programmering (TDDC77)

SMD 134 Objektorienterad programmering

Introduktion till Java

Objektorienterad programmering Föreläsning 12. Copyright Mahmud Al Hakim

TENTAMEN. Kurs: Objektorienterad programmeringsmetodik 5DV133 Ansvarig lärare: Anders Broberg. VT-13 Datum: Tid: kl

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

TENTAMEN OOP

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Föreläsning 11. Arrayer. Arrayer. Arrayer. Lagrar flera värden av samma typ Kan vara primitiva typer eller objekt. Kan ha en array av t.

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

Tentamen ID1004 Objektorienterad programmering May 29, 2012

E02 "The Review" Föreläsning 2, HT2013 Grunderna, repetition. Johan Leitet. Kurs: 1dv403 Webbteknik I

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

Laboration A Objektsamlingar

Transkript:

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

Typer Java har två sorters typer primitiva typer och referens-typer. Primitiva typer är typer för värden: int, float etc. Java har två sorters referens-typer array types samt class or interface types. Arrayer är ett specialfall. De bor på heapen, vi arbetar med dem via referenser, de är i praktisk mening objekt men typerna ser lite speciella ut. Vi pratar här om statiska typer de som används av typ-checkaren under kompilering.

Subtyper En typ A är en subtyp till en annan typ B, om alla element (värden eller objekt) av typ A kan användas som om de vore av typ B. En klasstyp C är en subtyp till Object Sin superclass (extends) och alla dess supertyper. Alla de interfaces C implementerar (implements). För primitiver finns en hierarki: byte short int long (boolean) char float double

Type conversion Typer kan på olika sätt konverteras: (Värden med) primitiva typer kan konverteras till (värden av) andra primitiva typer. (Värden med) primitiva typer kan konverteras till och från (objekt av) deras representativa klass-typer, e.g. int till Integer. En referenstyp A kan konverteras till en supertyp B, e.g. Triangle till Polygon. En referenstyp B kan castas till en subtyp A: Triangle t = (Triangle) polygons.get(0); Notera att detta enbart påverkar hur typen behandlas statiskt. Vi ber typcheckaren lita på oss och skulle objektet vi arbetar med vid runtime ha fel typ får vi ett exception.

Conversions En konvertering till en bredare typ kallas widening conversion och kommer alltid att fungera felfritt. En konvertering till en snävare typ kallas narrowing conversion. Med primitiver kommer viss loss of precision att ske, e.g. long till int. Med referenstyper får vi fel vid runtime om objektet inte redan hade rätt dynamisk typ. En konvertering från e.g. int till Integer kallas autoboxing. En konvertering från e.g. Integer till int kallas unboxing.

Array vs ArrayList För arrays gäller: Alla arraytyper är subtyper till Object. En arraytyp A[] är en subtyp till typ B[] om A är en subtyp till B arrayer är kovarianta (covariant). Typen för elementen kommer att minnas vid runtime, och vi får fel om vi försöker göra dumt. För generiska typer gäller: En generisk typ T<A> är inte en subtyp till typ T<B>, även om A är en subtyp till B generiska typer är invarianta (invariant). Typen för elementen kommer inte att minnas vid runtime, därför är den statiska typcheckaren mer strikt.

Generics och explicit varians För generiska typer kan vi explicit ange hur vi vill att subtyping ska hanteras: Invariant Covariant Contravariant List<Polygon> = new ArrayList<Polygon>(); List<? extends Polygon> = new ArrayList<Triangle>(); List<? super Triangle> = new ArrayList<Polygon>(); Mer om varians (variance) och dess teori på nästa föreläsningen.

Övning Utgå från DrawPolygons sen tidigare (kan laddas ner färdig från hemsidan). Skapa en ny class TestSubtyping. Skapa några variabler av följande typer (med samma längd): Polygon[], Triangle[], List<Polygon>, List<Triangle>. Testa följande, och se vad kompilatorn säger. Försök förutspå resultaten först: Vilken sorts objekt får ni lägga i respektive array eller lista? Triangle? Polygon? Object? Mellan vilka av era variabler får ni lov att tilldela (dvs hela arrayer eller listor)? Mellan vilka kan ni tilldela alla element från den ena till den andra (genom en for-loop)? Vilken typ av objekt kan ni plocka ut ur respektive array (a[index]) eller lista (l.get(index))? Hjälper explicit casting vid något av ovanstående? Skapa två nya variabler av följande typer: List<? extends Polygon>, List<? super Polygon>. Gör samma tester som ovan (med listorna från ovan). Förutspå resultaten innan ni testar. Skapa en metod paintall(graphics,list<polygon>):void som går igenom listan den får som argument och anropar paintmetoden på varje. Vilka av ovanstående listor kan ni ge som argument till denna metod? Kan ni lägga till nya element i listan inuti metoden? Ändra parametertypen för paintall till först covariant och sen contravariant. Hur påverkar respektive alternativ? Förutspå resultaten! Skapa en metod som tar två listor som argument, och flyttar alla element från den första till den andra. Vilka typer bör ni ge parametrarna för att göra metoden så användbar som möjligt? Kan ni göra samma sak för arrays? Hur skiljer det sig?