Parametrizované třídy Generics generické třídy. JDK zavádí mimo jiné tzv. parametrizované třídy - generics

Podobné dokumenty
JAVA. Zdrojové soubory

JAVA V Assertions Java, zimní semestr

Java. Generické typy

Java. Platformy apod.

Java. Platformy apod.

typová konverze typová inference

Generické typy. Podrobněji: The Java Language Specification ( Third Edition ) , 18

Návrhové vzory Tvorba objektů

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Generické programování v jazyce Java Generics programming in Java

Programování v jazyce Java. Tomáš Pitner, upravil Marek Šabo

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

WPA - Konfigurace Java EE aplikace (Maven, struktura war arch. kontejnerem Tomcat 8

Úvod do programovacích jazyků (Java)

Seminář Java IV p.1/38

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

20. Projekt Domácí mediotéka

7.5 Diagram tříd pokročilé techniky

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

7. Dynamické datové struktury

Datové abstrakce v programovacích jazycích

Java Výjimky Java, zimní semestr

7.5 Diagram tříd pokročilé techniky

Iterator & for cyklus

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Principy objektově orientovaného programování

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

9. přednáška - třídy, objekty

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Lambda funkce Novinky v interfaces Streamy Optional - aneb zbavujeme se null. Java 8. Ondřej Hrstka

Generické programování

Amaio Technologies, Inc., Třebohostická 14, Praha 10,

Dědění, polymorfismus

UJO Framework. revoluční architektura beans. verze

1. Dědičnost a polymorfismus

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

boolean hasnext() Object next() void remove() Kolekce

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

8 Třídy, objekty, metody, předávání argumentů metod

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Teoretické minimum z PJV

Jazyk C++ II. Šablony a implementace

Java Řetězce Java, zimní semestr

Novinky, s nimiž přichází Java 5.0

10 Generické implementace

Jazyk C# (seminář 3)

Abstraktní třída a rozhraní

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Výčtový typ strana 67

Návrhové vzory OMO, LS 2014/2015

Viditelnost (práva přístupu) Tomáš Pitner, upravil Marek Šabo

Vytváření a použití knihoven tříd

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Dědičnost (inheritance)

dovolují dělení velkých úloh na menší = dekompozice

Základy objektové orientace I. Únor 2010

RMI Remote Method Invocation

Generiky. Aplikační programování v Javě (BI-APJ) - 10 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

Dědičnost. seskupování tříd do hierarchie. potomek získá všechny vlastnosti a metody. provádí se pomocí dvojtečky za názvem třídy.

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

Abstraktní datové typy: zásobník

7. Datové typy v Javě

Funkční objekty v C++.

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

Java - řazení objektů

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Jazyk C# (seminář 6)

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

Java - výjimky. private void vstup() throws IOException {... }

PB161 Programování v jazyce C++ Přednáška 10

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Soubor jako posloupnost bytů

Programové konvence, dokumentace a ladění. Programování II 2. přednáška Alena Buchalcevová

Programování v Javě I. Únor 2009

PB161 Programování v jazyce C++ Přednáška 7

Komponenty v.net. Obsah přednášky

Algoritmizace a programování

PB161 Programování v jazyce C++ Přednáška 7

PROGRAMOVÁNÍ V C++ CVIČENÍ

Programování v C++ 2, 4. cvičení

24. listopadu 2013, Brno Připravil: David Procházka

1 - Úvod do platformy.net. IW5 - Programování v.net a C#

Projekty pro výuku programování v jazyce Java

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2009 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 25

Java Enum Java, zimní semestr ,2017 1

Třída jako zdroj funkcí

Programování v Javě I. Leden 2008

9. Polymorfismus a rozhraní

Objekty v PHP 5.x. This is an object-oriented system. If we change anything, the users object.

Pokročilé programování v jazyce C pro chemiky (C3220) Dědičnost tříd v C++

Jazyk C++ I. Šablony 2

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Transkript:

1 Parametrizované třídy Generics generické třídy JDK zavádí mimo jiné tzv. parametrizované třídy - generics

Úvod 2 podobnost se šablonami (templates) z C++ nejčastěji použité v oblasti knihoven kontejnerového typu běžný případ použití: List myintlist = new LinkedList(); myintlist.add(new Integer(0)); Integer x = (Integer) myintlist.iterator().next(); (); kompilárot pouze garantuje, že z iterátoru bude vrácen Object, je vyžadováno jeho přetypování

Úvod 3 parametrizované typy (generics) umožňují označit seznam jako vymezený (omezený) pouze pro zadaný typ (Java 5) upravená verze fragmentu programu: List<Integer> myintlist = new LinkedList<Integer> <Integer>(); myintlist.add(new Integer(O)); //2 Integer x = myintlist.iterator().next(); (); //3 popis specifikuje, že je to seznam pouze pro Integer, zapsáno List<Integer> říkáme, že List je generické rozhraní, které má typový parametr v našem případě Integer (parametrizované rozhraní)

Úvod 4 Běžný pohled: Integer z řádku 3 se přesunul jako typový parametr do řádku 1 velký rozdíl je v tom, že kompilátor ve druhém případě může kontrolovat správnost programu v době kompilace! specifikací je myintlist deklarovaný s typem List<Integer>, to říká něco o proměnné myintlist na rozdíl od přetypování, kteréříká, že programátor si myslí, že je něco pravdivé v konkrétném řádku kódu

Úvod 5 další výhodou této změny je zlepšenáčitelnost programů a jejich robustnost odolnost vůči chybám

Definování jednoduchého parametrizovaného typu 6 část definice rozhraní: public interface List <E> { void add(e x); Iterator<E> iterator(); public interface Iterator<E> { E next(); boolean hasnext(); <E> je deklarace formálních typových parametrů rozhraní List a Iterátor

Definování jednoduchého parametrizovaného typu 7 intuitivně si můžeme představit, že List<Integer> nahradí verzi List, kde E je zaměněno za Integer: public interface IntegerList { void add(integer x); Iterator<Integer> iterator(); je to užitečné, ale zavádějící, protože parametrizovaný typ List<Integer> nemá metody, které vypadají jako jeho rozšíření

Definování jednoduchého parametrizovaného typu 8 při vyvolání deklarace generického typu jsou všechny výskyty formálního typového parametru <E> nahrazeny skutečným typovým argumentem (v tomto případě Integer). deklarace generického typu je kompilována jednou pro všechny a převedena na jeden soubor se třídou podobně jako deklarace běžné třídy nebo rozhraní.

Definování jednoduchého parametrizovaného typu 9 Typové parametry jsou analogické běžným parametrům používaným v metodách a konstruktorech. Podobně jako metoda má formální parametry popisující typ hodnoty, má generická deklarace také formální typ parametrů. Když je vyvolaná generická deklarace, aktuální typ parametrů nahradí formální typ parametrů.

Generické třídy a podtřídy Generics and Subtypying 10 List<String> ls = new ArrayList<String>(); //1 List<Object> lo = ls; //2 v //2 je seznam řetězců seznamem objektů? is List of String List of Object není lo.add(new Object()); //3 String s = ls.get(0); //4 pokus přiřadit Object k // řet etězci Seznam řidičů můžeme považovat za seznam osob (řidič je podtřídou osoby), pak je ale možné přidat další osoby bez ŘP do seznamu řidičů

Generické třídy a podtřídy Generics and Subtypying 11 rutina, která tiskne prvky kolekce (předchozí verze): void printcollection(collection c) { Iterator i = c.iterator(); for(k=0; k< c.size(); k++) { System.out.println(i.next()); ()); Java 5 verze void printcollection(collection<object> c) { for(object e : c) { System.out.println(e); Collection<Object> není nadtřídou všech kolekcí!

Generické třídy a podtřídy Generics and Subtypying 12 využití typu wildcard; co je nadtřídou všech typů kolekcí? Collection<?> kolekce neznámých typů vyhovuje všem typům void printcollection(collection Collection<?> c) { for (Object e : c) { // popis Object správn vně není správné: System.out.println(e); Collection<?> c = new ArrayList<String>(); c.add(new Object()); // chyba kompilace c může obsahovat pouze řetězce

public abstract class Shape { public abstract void draw(canvas c); public class Circle extends Shape { private int x, y; radius; public void draw(canvas c) {... public class Rectangle extends Shape { private int x, y, width, height; public void draw(canvas c) {... Outline Bounded wildcards 13 public class Canvas { public void draw(shape s) { s.draw(this); public void drawall(list<shape> shapes) { for ( Shape s : shapes) { s.draw(this); // funguje jen pro typ Shape, ne pro jeho instance!!

Bounded Wildcard 14 provedeme změnu: public void drawall(list<? extends Shape> shapes) {... malý, ale významný rozdíl, List<Shape> je zaměněn za List<? extends Shape> nyní metoda drawall() akceptuje seznamy libovolné podtřídy třídy Shape, takže ji můžeme zavolat např. na List<Circle> List<? extends Shape> - je příkladem tzv. bounded wildcard? představuje neznámý typ podobně jako wildcard

Bounded Wildcard 15 Neznámý typ může být Shape, nebo podtřída, říkáme, že Shape je upper bound of wildcard horní hranice cena za toto rozšíření je ztráta možnosti zapisovat do shapes v tělech metod např.: public void addrectangle(list List<? extends Shape> shapes) { shapes.add(0, new Rectangle()); ); // compile time error typ druhého parametru metody shapes.add() ne neznámým podtypem typu Shape. Protože nevíme, jaký je to typ, nevíme, zda-li to není nadtyp typu Rectangle, takže není bezpečné tam vkládat objekty Rectangle