Polimorfizm a klasy generyczne w języku Java. Zdzisław Spławski 1

Podobne dokumenty
TYPY GENERYCZNE (GENERICS)

Programowanie obiektowe

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Metody sparametryzowane

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Typy uogólnione. Robert A. Kªopotek Wydziaª Matematyczno-Przyrodniczy. Szkoªa Nauk cisªych, UKSW

Java niezbędnik programisty spotkanie nr 9. Java 2 Platform, Standard Edition 5.0

Przykład -

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Programowanie obiektowe i zdarzeniowe

Języki i metody programowania Java. Wykład 2 (część 2)

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Typy uogólnione. Programowanie obiektowe. Jacek Sroka na podstawie materiałów Janusza Jabłonowskiego. 8 kwietnia 2013

Języki i techniki programowania Ćwiczenia 2

Typy sparametryzowane

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Programowanie obiektowe

Programowanie obiektowe

Dziedziczenie. dr Jarosław Skaruz

Wykład 8: Obsługa Wyjątków

Programowanie obiektowe

Wykład 6: Dziedziczenie

Programowanie Komputerów

Projektowanie obiektowe. Roman Simiński Polimorfizm

Programowanie w Javie wykład 8 Interfejsy

Dokumentacja do API Javy.

JAVA W SUPER EXPRESOWEJ PIGUŁCE

PARADYGMATY PROGRAMOWANIA Wykład 4

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Aplikacje w środowisku Java- wykład 6 Klasy wewnętrzne, klasy anonimowe Klasy opakowujące Typy i metody sparametryzowane (generics) wildcards

Szablony funkcji i klas (templates)

Dawid Gierszewski Adam Hanasko

Język JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Platformy Programistyczne Podstawy języka Java

Język JAVA podstawy. Wykład 4, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Klasy abstrakcyjne, interfejsy i polimorfizm

Aplikacje w Javie wykład 6 Klasy wewnętrzne, klasy anonimowe Typy i metody sparametryzowane (generics)

Programowanie obiektowe

Dziedziczenie. Tomasz Borzyszkowski

1. Co można powiedzieć o poniższym kodzie (zakładając, że zaimportowano wszystkie niezbędne klasy)?

1 Atrybuty i metody klasowe

Wykład 11 Podtypy a dziedziczenie

Zofia Kruczkiewicz, Programowanie obiektowe - java, wykład 2 1

Polimorfizm. dr Jarosław Skaruz

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Programowanie obiektowe

Programowanie 2. Język C++. Wykład 2.

Wykład 7: Pakiety i Interfejsy

dziedziczenie - po nazwie klasy wystąpią słowa: extends nazwa_superklasy

Klasy generyczne. ZbiórLiczb. ZbiórCzegokolwiek. Zbiór

Metody Metody, parametry, zwracanie wartości

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Akademia ETI. Wprowadzenie do programowania w Javie PG Java User Group Przemysław Kulesza

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Języki i metody programowania Java INF302W Wykład 2 (część 1)

Java podstawy jęyka. Wykład 2. Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne.

Programowanie w Internecie. Java

public - może być używana w kodzie poza klasą, jedna klasa ModyfikatorKlasy może być kombinacją wyrażeń:

Podstawy otwartych języków programowania Przechowywanie danych

Szablony. Szablony funkcji

Programowanie w Javie wykład 9 Klasy wewnętrzne, klasy anonimowe Klasy opakowujące

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Programowanie obiektowe

Zad.30. Czy można utworzyć klasę, która implementuje oba interfejsy?

1. Co będzie wynikiem wykonania poniŝszych instrukcji? g2d.gettransform().scale(1, -1); g2d.gettransform().translate(4, -8); g2d.drawline(4, 0, 4, 4);

Związek między pojęciami Zasada podstawialności Podklasy muszą realizować kontrakt zawarty przez nadklasy

Wykład 5: Więcej o Klasach i Metodach

Definicje klas i obiektów. Tomasz Borzyszkowski

Enkapsulacja, dziedziczenie, polimorfizm

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Programowanie Komputerów

Szablony funkcji i szablony klas

JAVA. Platforma JSE: Środowiska programistyczne dla języka Java. Wstęp do programowania w języku obiektowym. Opracował: Andrzej Nowak

Wykład 2: Podstawy Języka

Kurs programowania. Wykład 9. Wojciech Macyna

Programowanie w Javie wykład 7 Klasy c.d. (przeciążanie metod, polimorfizm) Metody i klasy abstrakcyjne Bloki inicjalizacyjne

KOTLIN. Język programowania dla Androida

Java: interfejsy i klasy wewnętrzne

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Podejście obiektowe. Tablice obiektów Przykład 1 metody i atrybuty statyczne oraz niestatyczne

Wykład 4: Klasy i Metody

MATERIAŁY DO ZAJĘĆ II

Programowanie 2. Język C++. Wykład 3.

Programowanie obiektowe

import java.util.*; public class ListExample { public static void main(string args[]) { List<String> lista1= new ArrayList<String> ();

Aplikacje w Javie wykład 5 Klasy c.d. (przeciążanie metod, polimorfizm) Metody i klasy abstrakcyjne Interfejsy

Transkrypt:

Polimorfizm a klasy generyczne w języku Java Zdzisław Spławski 1

Klasyfikacja polimorfizmów Polimorfizm <gr. πολυζ = liczny + µορϕη = postać> ogólnie oznacza wielopostaciowość i umożliwia przypisanie różnych typów temu samemu programowi Polimorfizm inkluzyjny Podtypowanie Dziedziczenie Polimorfizm parametryczny Polimorfizm ograniczeniowy = polimorfizm parametryczny + polimorfizm podtypowy Polimorfizm ad hoc Przeciążanie (overloading) Koercja Zdzisław Spławski 2

Polimorfizm ad hoc przeciążanie operatorów Operatory dla operacji arytmetycznych w Javie są przeciążone dla wszystkich typów numerycznych, ale argumenty muszą być tego samego typu. 5.0 + 3.4 dodawanie liczb typu double 5 + 3.4 koercja lewego argumentu do typu double 5 + 3.4F koercja lewego argumentu do typu float Zastosowanie koercji i/lub przeciążenia zależy od decyzji implementacyjnych Zdzisław Spławski 3

Polimorfizm ad hoc przeciążanie metod Przeciążanie (overloading) pozwala na używanie tej samej nazwy dla różnych metod. Kompilator Javy wybiera metodę statycznie na podstawie jej sygnatury (wczesne wiązanie). Zdzisław Spławski 4

Polimorfizm ad hoc przeciążanie metod public class C { void m( C other ) { System.out.print("C.m(C) "); public class SubCOverload extends C { void m( SubCOverload other ) // przeciążenie m { System.out.print("SubCOverload.m(SubCOverload) ");... C c = new C(); C c1 = new SubCOverload(); SubCOverload sc = new SubCOverload(); c1.m(c); c1.m(c1); c1.m(sc); sc.m(c); sc.m(c1); sc.m(sc); c1: C.m(C) C.m(C) C.m(C) sc: C.m(C) C.m(C) SubCOverload.m(SubCOverload) Zdzisław Spławski 5

Polimorfizm ad hoc- koercja między typami prostymi a klasami opakowującymi Fragment klasy opakowującej Integer public final class Integer { private int i; public Integer(int i) { this.i = i; public int intvalue() { return i; Integer wi1 = new Integer(5); // opakowanie int i1 = wi1.intvalue(); // rozpakowanie Automatyczna koercja Integer wi2 = 5; int i2 = wi2; Zdzisław Spławski 6

Polimorfizm inkluzyjny Polimorfizm inkluzyjny (ang. inclusion polymorphism) zakłada istnienie zwrotnej i przechodniej relacji quasiporządku (ang. preorder) między typami. Mówimy, że typ S jest podtypem typu T, który jest nazywany nadtypem typu S (notacja S <: T), jeśli każda wartość typu S może być bezpiecznie użyta w kontekście, w którym oczekiwana jest wartość typu T (zasada zamienialności, ang. substitution principle, subsumption rule). Szczególnymi przypadkami polimorfizmu inkluzyjnego są podtypowanie i dziedziczenie. Hierarchie dziedziczenia i podtypowania są w ogólnym przypadku niezależne, np. w OCamlu. Zdzisław Spławski 7

Polimorfizm inkluzyjny public class Pair { private Object e1, e2; public Pair(Object e1, Object e2) { this.e1 = e1; this.e2 = e2; public Object getfst() { return e1; public Object getsnd() { return e2; public String tostring() { return "(" + e1 + ", " + e2 + ")"; Wykorzystanie tej klasy wymaga rzutowania w dół, co pociąga za sobą narzut czasowy i pamięciowy. Pair p; p = new Pair("Five", new Integer(5)); String numeral = (String) p.getfst(); Integer number = (Integer) p.getsnd(); numeral = (String) p.getsnd(); // wyjątek: ClassCastException Zdzisław Spławski 8

Polimorfizm parametryczny Polimorfizm parametryczny (ang. parametric polymorphism) pozwala typizować kod generycznie, używając zmiennych typowych w miejsce konkretnych typów. Gwarantuje on takie samo zachowanie (fragmentu) programu dla wielu typów. Zdzisław Spławski 9

Polimorfizm parametryczny (klasy generyczne) public class Pair<A, B> { private A e1; private B e2; public Pair(A e1, B e2) { this.e1 = e1; this.e2 = e2; public A getfst() { return e1; public B getsnd() { return e2; public String tostring() { return "(" + e1 + ", " + e2 + ")"; Kontrola typów jest wykonywana statycznie w czasie kompilacji i wyjątek ClassCastException nigdy nie zostanie zgłoszony. Pair<String, Integer> p; p = new Pair<String, Integer> ("Five", 5); String numeral = p.getfst(); Integer number = p.getsnd(); numeral = p.getsnd(); // błąd kompilacji: incompatible types Zdzisław Spławski 10

Implementacja klas generycznych Klasa jest wykorzystywana: jako generator obiektów jako nazwa typu do tworzenia nowych klas Technika wycierania typów (ang. erasure) Generowanie jednego kodu Typy surowe (ang. raw types) Pair<String, String> ps = new Pair<String, String>("fst","snd"); Pair<Integer, Integer> pi = new Pair<Integer, Integer>(1,2); System.out.println(pS.getClass()); // wypisuje: class Pair System.out.println(pI.getClass()); // wypisuje: class Pair System.out.println(pS instanceof Pair); // wypisuje: true System.out.println(pI instanceof Pair); // wypisuje: true Zdzisław Spławski 11

Kowariancja i kontrawariancja S f T S S f T T Funkcja f: S T i funkcja f : S T, która ma zastąpić funkcję f (S T ) <: (S T) wtedy i tylko wtedy, kiedy S <: S oraz T <: T Operator przestrzeni funkcyjnej jest kontrawariantny (przeciwzmienny) względem pierwszego argumentu i kowariantny (współzmienny) względem drugiego argumentu Kontrawariantne argumenty funkcji są odbiornikami wartości z otoczenia Kowariantny wynik funkcji jest źródłem wartości dla otoczenia Zdzisław Spławski 12

Klasy generyczne jako operatory na typach Operator G jest kowariantny, jeśli S <: T implikuje G<S> <: G<T> Operator G jest kontrawariantny, jeśli S <: T implikuje G<T> <: G<S> Operator G jest niezmienniczy, jeśli koniunkcja S <: T i T <: S implikuje G<S> <: G<T> Niezmienniczość jest konieczna, jeśli referencja jest jednocześnie źródłem i odbiornikiem. Podtypowanie w Javie jest niezmiennicze dla typów generycznych. Zdzisław Spławski 13

Tablice są kowariantne! public class TestArrays { public static void main(string[] args) { Integer[] arrint = {new Integer(1), new Integer(2); Number[] arrnum = arrint; arrnum[0] = new Float(3.14); // wyjątek ArrayStoreException: // Exception in thread "main" java.lang.arraystoreexception:java.lang.float // at TestArrays.main(TestArrays.java:5) Odbiornik wartości wymaga podtypowania kontrawariantnego. Kowariantność tablic w Javie powoduje konieczność sprawdzania w czasie wykonania każdego przypisania w każdej tablicy zgodności typów. Typy generyczne są inwariantne, więc poniższy kod powoduje błąd kompilacji generic array creation. Pair<Integer, Integer>[] t = new Pair<Integer, Integer>[5]; Zdzisław Spławski 14

Kowariancja typów zwracanych class A { public Number metoda() {return new Double(3.14); class B extends A { public Integer metoda() {return new Integer(5); public class CovariantReturn{ public static void main(string[] args){ A a = new A(); Number n = a.metoda(); System.out.println(n); // wypisuje: 3.14 a = new B(); n = a.metoda(); System.out.println(n); // wypisuje: 5 Można zastąpić metodę m:s T metodą m :S T jeśli T <: T. W Javie 1.4 ten program spowodowałby błąd kompilacji: metoda() in B cannot override metoda() in A; attempting to use incompatible return type. Zdzisław Spławski 15

Polimorfizm ograniczeniowy Ograniczenia w postaci minimalnych nadtypów i/lub maksymalnych podtypów? ~ wieloznacznik oznacza dowolny typ? extends T ~? <: T? super T ~ T <:? public static <T> void copy(list<? super T> dest, List<? extends T> src) { for (int i=0; i < src.size(); i++) { dest.set(i, src.get(i)); List<Object> objs = Arrays.<Object>asList(1, 2.2, "three"); List<Integer> ints = Arrays.asList(3, 4); Collections.<Number>copy(objs, ints); System.out.println(objs.toString()); // wypisuje: [3, 4, three] Zdzisław Spławski 16

Typy parametryzowane a typy surowe Przejście do klas generycznych może być stopniowe Typowy przypadek: użycie biblioteki generycznej ze starym kodem klienta Przykład: wykorzystanie klasy Pair<A,B> z kodem dla klasy Pair Pair p = new Pair("Five", new Integer(5)); String numeral = (String) p.getfst(); Integer number = (Integer) p.getsnd(); TestPair.java:3: warning: [unchecked] unchecked call to Pair(A,B) as a member of the raw type Pair Pair p = new Pair("Five", new Integer(5)); ^ Zdzisław Spławski 17