Download presentation
Presentation is loading. Please wait.
Published byJulianna Fleming Modified over 9 years ago
1
Generic Data Structures "Get your data structures correct first, and the rest of the program will write itself." - David Jones EE 422CGenerics 1
2
Covariance of arrays Employee [] array = new Lawyer[10]; Compiles, because a Lawyer IS-A Employee, and Java allows this. Since a Lawyer IS-A Employee, a Lawyer [] IS-A Employee []. You can pass in a Lawyer [] as a parameter to a method that asks for an Employee []. EE 422CGenerics 2
3
Covariance of return types class Marketer extends Employee { public Object doSomething () { return new Object(); } class Advertiser extends Marketer { @Override public Employee doSomething () { return new Employee(10); } Override does not give compile error. Covariant return types. EE 422CGenerics 3
4
EE 422CGenerics 4 Back to our Array Based List Didn't want to have to write a new list class for every data type we want to store in lists Used an array of Object s to store the elements of the list // from array based list private Object[] myCon;
5
EE 422CGenerics 5 Using Object In Java, all classes inherit from exactly one other class except Object which is at the top of the class hierarchy Object variables can refer to objects of their declared type and any descendants –polymorphism Thus, if the internal storage container is of type Object it can hold anything –primitives handled by wrapping them in objects. int – Integer, char - Character
6
EE 422CGenerics 6 Difficulties with Object Creating generic containers using the Object data type and polymorphism is relatively straight forward Using these generic containers leads to some difficulties –Casting –Type checking Code examples on the following slides
7
EE 422CGenerics 7 Code Example - Casting Assume a list class ArrayList li = new ArrayList(); li.add("Hi"); System.out.println( li.get(0).charAt(0) ); // previous line has syntax error // return type of get is Object // Object does not have a charAt method // compiler relies on declared type System.out.println( ((String)li.get(0)).charAt(0) ); // must cast to a String
8
EE 422CGenerics 8 Code Example – type checking //pre: all elements of li are Strings public void printFirstChar(ArrayList li) { String temp; for(int i = 0; i < li.size(); i++) { temp = (String)li.get(i); if( temp.length() > 0 ) System.out.println( temp.charAt(0) ); } // what happens if pre condition not met?
9
EE 422CGenerics 9 Too Generic? Does the compiler allow this? ArrayList list = new ArrayList(); list.add( "Olivia" ); list.add( new Integer(12) ); list.add( new Rectangle() ); list.add( new ArrayList() ); A.Yes B.No
10
Is this a bug or a feature? EE 422CGenerics 10
11
EE 422CGenerics 11 "Fixing" the Method //pre: all elements of li are Strings public void printFirstChar(ArrayList li) { String temp; for(int i = 0; i < li.size(); i++) { if( li.get(i) instanceof String ){ temp = (String)li.get(i); if( temp.length() > 0 ) System.out.println( temp.charAt(0) ); }
12
EE 422CGenerics 12 Generic Types Java has syntax for parameterized data types Referred to as Generic Types in most of the literature A traditional parameter has a data type and can store various values just like a variable public void foo(int x) Generic Types are like parameters, but the data type for the parameter is data type –like a variable that stores a data type –this is an abstraction. Actually, all data type info is erased at compile time
13
EE 422CGenerics 13 Making our Array List Generic public class GenericList { The is the declaration of a data type parameter for the class –any legal identifier: Foo, AnyType, Element, DataTypeThisListStores –Sun style guide recommends terse identifiers The value E stores will be filled in whenever a programmer creates a new GenericList GenericList li = new GenericList ();
14
EE 422CGenerics 14 Modifications to GenericList instance variable private E[] myCon; Parameters on –add, insert, remove, insertAll Return type on –get Changes to creation of internal storage container myCon = (E[])new Object[DEFAULT_SIZE]; Constructor header does not change
15
EE 422CGenerics 15 Using Generic Types Back to Java's ArrayList ArrayList list1 = new ArrayList(); –still allowed, a "raw" ArrayList –works just like our Array –casting, lack of type safety
16
EE 422CGenerics 16 Using Generic Types ArrayList list2 = new ArrayList (); –for list2 E stores String list2.add( "Isabelle" ); System.out.println( list2.get(0).charAt(2) ); //ok list2.add( new Rectangle() ); // syntax error
17
EE 422CGenerics 17 Parameters and Generic Types Old version //pre: all elements of li are Strings public void printFirstChar(ArrayList li){ New version //pre: none public void printFirstChar(ArrayList li){ Elsewhere ArrayList list3 = new ArrayList (); printFirstChar( list3 ); // ok ArrayList list4 = new ArrayList (); printFirstChar( list4 ); // syntax error
18
EE 422CGenerics 18 Generic Types and Subclasses ArrayList list5 = new ArrayList (); list5.add( new Rectangle() ); list5.add( new Square() ); list5.add( new Circle() ); // all okay list5 can store Shape objects and any descendants of Shape
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.