Generics 2-May-19.

Slides:



Advertisements
Similar presentations
Why not just use Arrays? Java ArrayLists.
Advertisements

1-May-15 Java 1.5. Reason for changes “The new language features all have one thing in common: they take some common idiom and provide linguistic support.
5-May-15 ArrayLists. 2 ArrayList s and arrays A ArrayList is like an array of Object s Differences between arrays and ArrayList s: Arrays have special.
11-Jun-15 Generics. A generic is a method that is recompiled with different types as the need arises The bad news: Instead of saying: List words = new.
30-Jun-15 Generics. Arrays and collections In Java, array elements must all be of the same type: int[] counts = new int[10]; String[] names = { "Tom",
15-Jul-15 Generics. ArrayList s and arrays A ArrayList is like an array of Object s, but... Arrays use [ ] syntax; ArrayList s use object syntax An ArrayList.
16-Jul-15 Java Versions of Java Java 1 Java 2 Java 5.0 Oak: Designed for embedded devices Java 1.1: Adds inner classes and a completely new event-handling.
CSE373 Optional Section Java Collections 11/12/2013 Luyi Lu.
P Object type and wrapper classes p Object methods p Generic classes p Interfaces and iterators Generic Programming Data Structures and Other Objects Using.
Chapter 21 Generics 1. Generics - Overview Generic Methods specify a set of related methods Generic classes specify a set of related types Software reuse.
Effective Java: Generics Last Updated: Spring 2009.
Generics1 Parametrized classes and methods. Generics2 What are generics Generics are classes or interfaces that can be instantiated with a variety of.
Generics1 Parametrized classes and methods. Generics2 What are generics Generics are classes or interfaces that can be instantiated with a variety of.
Generics1 Parametrized classes and methods. Generics2 What are generics Generics are classes or interfaces that can be instantiated with a variety of.
ArrayList, Multidimensional Arrays
Lists Ellen Walker CPSC 201 Data Structures Hiram College.
Java 5 Part 1 CSE301 University of Sunderland Harry Erwin, PhD.
1 Generics Chapter 21 Liang, Introduction to Java Programming.
Generics CompSci 230 S Software Construction.
CS-2851 Dr. Mark L. Hornick 1 Generic Java Classes Implementing your own generic classes.
©SoftMoore ConsultingSlide 1 Generics “Generics constitute the most significant change in the Java programming language since the 1.0 release.” – Cay Horstmann.
GENERICS AND THE JAVA COLLECTIONS FRAMEWORK Lecture 16 CS2110 – Fall 2015 Photo credit: Andrew Kennedy.
Collections Mrs. C. Furman April 21, Collection Classes ArrayList and LinkedList implements List HashSet implements Set TreeSet implements SortedSet.
11-Jan-16 Bits and Pieces Some random things in Java.
1 CSC 2053 New from AutoBoxing 3 Before J2SE 5.0, working with primitive types required the repetitive work of converting between the primitive.
4-Mar-16 Introduction to Collections. Revision questions True false questions 0 for False 1 for True Please do not answer anything other than the above.
1 Chapter 21 Generics. 2 Objectives F To use generic classes and interfaces (§21.2). F To declare generic classes and interfaces (§21.3). F To understand.
19-Mar-16 Collections and ArrayLists.. 2 Collections Why use Collections. Collections and Object-Orientation. ArrayLists. Special Features. Creating ArrayLists.
EKT472: Object Oriented Programming
CMSC 202 ArrayList Aug 9, 2007.
Java 1.5 New Features 22-Apr-18.
Chapter 7 – Arrays and Array Lists
Sixth Lecture ArrayList Abstract Class and Interface
(like an array on steroids)
Fundamentals of Java: AP Computer Science Essentials, 4th Edition
Software Development Java Collections
John Hurley Cal State LA
Java Generics.
COP 3503 FALL 2012 Shayan Javed Lecture 8
Some random things in Java
Array List Pepper.
Generics A Brief Review 16-Nov-18.
Introduction to Collections
Some random things in Java
ArrayLists.
Generics (Parametric Polymorphism)
CISC124 Assignment 4 on Inheritance due next Monday, the 12th at 7pm.
CISC124 Assignment 4 on Inheritance due next Monday, the 12th at 7pm.
ArrayLists.
Introduction to Collections
Generics 27-Nov-18.
Lecture 26: Advanced List Implementation
Some random things in Java
CMSC 202 ArrayList Aug 9, 2007.
Barb Ericson Georgia Institute of Technology June 2006
CMSC 202 ArrayList Aug 9, 2007.
Grouped Data Arrays, and Array Lists.
Chapter 6 Array-Based Lists.
ArrayLists 22-Feb-19.
Interator and Iterable
slides created by Marty Stepp
Generics, Lambdas, Reflections
Some random things in Java
ArrayLists.
ArrayLists 27-Apr-19.
slides created by Alyssa Harding
Java 5 New Features 1-May-19.
Review: libraries and packages
CMPE212 – Reminders Assignment 4 on Inheritance due next Friday.
COMP204 Bernhard Pfahringer (with input from Robi Malik)
Presentation transcript:

Generics 2-May-19

ArrayLists and arrays A ArrayList is like an array of Objects, but... Arrays use [ ] syntax; ArrayLists use object syntax An ArrayList expands as you add things to it Arrays can hold primitives or objects, but ArrayLists can only hold objects To create an ArrayList: ArrayList myList = new ArrayList(); Or, since an ArrayList is a kind of List, List myList = new ArrayList(); To use an ArrayList, boolean add(Object obj) Object set(int index, Object obj) Object get(int index)

ArrayLists, then and now Starting in Java 5, ArrayLists have been genericized That means, every place you used to say ArrayList, you now have to say what kind of objects it holds; like this: ArrayList<String> If you don’t do this, you will get a warning message, but your program will still run

Auto boxing and unboxing Java won’t let you use a primitive value where an object is required--you need a “wrapper” ArrayList<Integer> myList = new ArrayList<Integer>(); myList.add(new Integer(5)); Similarly, you can’t use an object where a primitive is required--you need to “unwrap” it int n = ((Integer)myArrayList.get(2)).intValue(); Java 1.5 makes this automatic: myArrayList<Integer> myList = new myArrayList<Integer>(); myList.add(5); int n = myList.get(2); Other extensions make this as transparent as possible For example, control statements that previously required a boolean (if, while, do-while) can now take a Boolean There are some subtle issues with equality tests, though

Generics A generic is a method that is recompiled with different types as the need arises The bad news: Instead of saying: List words = new ArrayList(); You'll have to say: List<String> words = new ArrayList<String>(); The good news: Replaces runtime type checks with compile-time checks No casting; instead of String title = (String) words.get(i); you use String title = words.get(i); Some classes and interfaces that have been “genericized” are: Vector, ArrayList, LinkedList, Hashtable, HashMap, Stack, Queue, PriorityQueue, Dictionary, TreeMap and TreeSet

Generic Iterators An Iterator is an object that will let you step through the elements of a list one at a time List<String> listOfStrings = new ArrayList<String>(); ... for (Iterator i = listOfStrings.iterator(); i.hasNext(); ) { String s = (String) i.next(); System.out.println(s); } Iterators have also been genericized: List<String> listOfStrings = new ArrayList<String>(); ... for (Iterator<String> i = listOfStrings.iterator(); i.hasNext(); ) { String s = i.next(); System.out.println(s); } You can also use the new for statement (to be discussed)

Writing generic methods private void printListOfStrings(List<String> list) { for (Iterator<String> i = list.iterator(); i.hasNext(); ) { System.out.println(i.next()); } } This method should be called with a parameter of type List<String>, but it can be called with a parameter of type List The disadvantage is that the compiler won’t catch errors; instead, errors will cause a ClassCastException This is necessary for backward compatibility Similarly, the Iterator need not be genericized as an Iterator<String>

Type wildcards Here’s a simple (no generics) method to print out any list: private void printList(List list) { for (Iterator i = list.iterator(); i.hasNext(); ) { System.out.println(i.next()); } } The above still works in Java 1.5, but now it generates warning messages Java 1.5 incorporates lint (like C lint) to look for possible problems You should eliminate all errors and warnings in your final code, so you need to tell Java that any type is acceptable: private void printListOfStrings(List<?> list) { for (Iterator<?> i = list.iterator(); i.hasNext(); ) { System.out.println(i.next()); } }

Writing your own generic types public class Box<T> { private List<T> contents; public Box() { contents = new ArrayList<T>(); } public void add(T thing) { contents.add(thing); } public T grab() { if (contents.size() > 0) return contents.remove(0); else return null; } Sun’s recommendation is to use single capital letters (such as T) for types If you have more than a couple generic types, though, you should use better names

New for statement The syntax of the new statement is for(type var : array) {...} or for(type var : collection) {...} Example: for(float x : myRealArray) { myRealSum += x; } For a collection class that has an Iterator, instead of for (Iterator iter = c.iterator(); iter.hasNext(); ) ((TimerTask) iter.next()).cancel(); you can now say for (TimerTask task : c) task.cancel();

New for statement with arrays The new for statement can also be used with arrays Instead of for (int i = 0; i < array.length; i++) { System.out.println(array[i]); } you can say (assuming array is an int array): for (int value : array) { System.out.println(value); } Disadvantage: You don’t know the index of any of your values

Creating a ArrayList the old way The syntax for creating ArrayLists has changed between Java 1.4 and Java 5 For compatibility reasons, the old way still works, but will give you warning messages Here are the (old) constructors: import java.util.ArrayList; ArrayList vec1 = new ArrayList(); Constructs an ArrayList with an initial capacity of 10 ArrayList vec2 = new ArrayList(initialCapacity);

Creating a ArrayList the new way Specify, in angle brackets after the name, the type of object that the class will hold Examples: ArrayList<String> vec1 = new ArrayList<String>(); ArrayList<String> vec2 = new ArrayList<String>(10); To get the old behavior, but without the warning messages, use the <?> wildcard Example: ArrayList<?> vec1 = new ArrayList<?>();

Accessing with and without generics Object get(int index) Returns the component at position index Using get the old way: ArrayList myList = new ArrayList(); myList.add("Some string"); String s = (String)myList.get(0); Using get the new way: ArrayList<String> myList = new ArrayList<String>(); myList.add("Some string"); String s = myList.get(0); Notice that casting is no longer necessary when we retrieve an element from a “genericized” ArrayList

Summary If you think of a genericized type as a type, you won’t go far wrong Use it wherever a type would be used ArrayList myList becomes ArrayList<String> myList new ArrayList() becomes new ArrayList<String>() public ArrayList reverse(ArrayList list) becomes public ArrayList<String> reverse(ArrayList<String> list) Advantage: Instead of having collections of “Objects”, you can control the type of object Disadvantage: more complex, more typing

The End