370 likes | 383 Views
עקרונות תכנות מונחה עצמים תרגול 2 1: Generics. Outline. Generic classes Generics & Inheritance Wild Cards characters Case study: Generic Graph. Generic Classes – Motivation. List v = new ArrayList (); v.add ("test"); Integer i = (Integer) v.get (0); => // runtime error.
E N D
עקרונות תכנות מונחה עצמיםתרגול 21: Generics
Outline • Generic classes • Generics & Inheritance • Wild Cards characters • Case study: Generic Graph
Generic Classes – Motivation List v = new ArrayList(); v.add("test"); Integer i = (Integer)v.get(0); => // runtime error List<String> v = new ArrayList<String>(); v.add("test"); Integer i = (Integer)v.get(0); => // compilation error
Generic Classes • A class is generic if it declares one or more type variables. • A generic class is defined with the following format: class name<T1, T2, ..., Tn> { /* ... */ } • The type parameter section, delimited by angle brackets (<>), follows the class name. It specifies the type parameters (also called type variables) T1,T2, ..., and Tn. • The type variables can be used as: • Method parameters. • Return value. • Local variables.
Generic Classes – Example public interface List<E> { void add(E x); Iterator<E> iterator(); } publicinterface Iterator<E> { E next(); booleanhasNext(); } public class ArrayList<E> implements List<E> { private E[] _data; ... }
Generic Classes vsConcrete Classes • Generic Class declaration defines a set of parameterized types, one for each possible invocation of the type parameter section. • All compiles to the same .class file. • All uses the same .class file at runtime.
Generic Classes VS Concrete Classes (Example) public class ArrayList<E> implements List<E> { private E[] _data; ... } List<String> v; v = new ArrayList<String>(); Generic class Compile to ArrayList.class Concrete class Uses ArrayList.class
Assignments roles: • If a type A is of a sub-class of type B we will mark it as: • We can assign (runtime) type A to a (compile time) variable B iff
Using wild cards – Motivation Vector<Animal> animals; Vector<Cat> cats = new Vector<Cat>(); animals = cats; animals.add(new Dog()); Cat cat = cats.elementAt(0); // Animal animal; animal = new Dog(); Cat cat = animal; // // compilation error!!! // compilation error!!!
Using wild cards • We can read type B from A. • We can write type A to B. • We will use wild card (?) to represent an unknown type.
Using wild cards • ? extends A – a variable type which can only be read from. We can write only null to it. • ? super B – a variable type which can only be written to. We can read only Object from it.
Using wild cards – example: publicstaticvoidmakeNoise (Vector<Animal> animals) { for (Animal animal:animals) { animal.say(); } { Vector<Cat> cats = new Vector<Cat>(); makeNoise(cats); => Correction: publicstaticvoidmakeNoise (Vector<? extends Animal> animals) // compilation error!!!
Using wild cards – example: Vector<? extends Animal> animals = null; Vector<Cat> cats = new Vector<Cat>(); animals = cats; animals.add(new Dog()); Cat cat = cats.elementAt(0); => // compilation error!!! Correction: animals.add(null); - The only one that allows.
Using wild cards – examples: Vector<? extends Animal> animals = new Vector<Cat>(); Vector<? extends Cat> cats = new Vector<Animal>(); Vector<? super Animal> animals2 = new Vector<Cat>(); Vector<? super Cat> cats2 = new Vector<Animal>(); animals.add(new Cat()); cats.add(new Cat()); animals.add(null); Cat cat = animals.elementAt(0); Animal animal = cats.elementAt(0); Cat cat2 = animals2.elementAt(0); Animal animal2 = animals2.elementAt(0); Object o = animals2.elementAt(0); // compilation error // compilation error // compilation error // compilation error // compilation error // compilation error // compilation error
Question from 2013 test. נתון שהמחלקה Bיורשת מהמחלקה A, והמחלקה G היא גנרית עם פרמטר יחיד. מה צריך להיות הפרמטר X כדי שההשמה הבאה תהיה תקפה ע"פ כללי הטיפוסים של ג'אווה? G<X> g = new G<B>(); א. A ב. extends A ? ג. super A ? ד. super B ? ה. תשובות ב, ד נכונות ו. תשובות א ,ג נכונות
Question from 2013 test. נתון שהמחלקה Bיורשת מהמחלקה A, והמחלקה G היא גנרית עם פרמטר יחיד. מה צריך להיות הפרמטר X כדי שההשמה הבאה תהיה תקפה ע"פ כללי הטיפוסים של ג'אווה? G<X> g = new G<B>(); א. A ב. extends A ? ג. super A ? ד. super B ? ה. תשובות ב, ד נכונות ו. תשובות א ,ג נכונות
Graphs can model • The internet • Maps • Social networks • …
Summary • Generic class ( List<E> ) • ? extends A • ? super A
Summary • Generic class ( List<E> ) • ? extends A • ? super A