1 / 38

CSC 7322 : Object Oriented Development J Paul Gibson, A207 paul.gibson@telecom-sudparis.eu

CSC 7322 : Object Oriented Development J Paul Gibson, A207 paul.gibson@telecom-sudparis.eu http:// www-public. telecom -sudparis.eu /~gibson/Teaching/CSC7322/. Generics (in Java) …/~ gibson / Teaching /CSC7322/L10-Generics.pdf. 1 Generics - Some History.

derex
Download Presentation

CSC 7322 : Object Oriented Development J Paul Gibson, A207 paul.gibson@telecom-sudparis.eu

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CSC 7322 : Object OrientedDevelopment J Paul Gibson, A207 paul.gibson@telecom-sudparis.eu http://www-public.telecom-sudparis.eu/~gibson/Teaching/CSC7322/ Generics(in Java) …/~gibson/Teaching/CSC7322/L10-Generics.pdf TSP: Software Engineering

  2. 1 Generics - SomeHistory M.D. McIlroy: Mass-Produced Software Components, Proceedings of the 1st International Conference on Software Engineering, GarmischPattenkirchen, Germany, 1968 Joseph A. Goguen: ParameterizedProgramming. IEEE Trans. Software Eng. 10(5) 1984 David R. Musser, Alexander A. Stepanov: GenericProgramming. ISSAC 1988 Charles W Kreuger, Software Reuse, ACM ComputingSurveys, 1992 Ronald Garcia et al, A Comparative Study of Language Support for GenericProgramming, OOPSLA03, 2003 TSP: Software Engineering

  3. 1 Generics - Some Java History Martin Oderskyand Philip Wadler. Pizza into Java: translatingtheoryinto practice. In Proceedings of the 24th ACM SIGPLAN-SIGACT symposium on Principles of programminglanguages (POPL '97). GiladBracha, Martin Odersky, David Stoutamire, and Philip Wadler. Making the future safe for the past: adding genericity to the Java programming language. SIGPLAN Not. 33, 10 (October 1998), May 1999 - Sun proposes to Add Generics to Java, based on GJ. The activity (named JSR 14) is headed by GiladBracha JSR-000014 Adding Generics to the JavaTM Programming Language (Close of Public Review: 01 August 2001) http://jcp.org/aboutJava/communityprocess/review/jsr014/index.html MadsTorgersen et al., Adding wildcards to the Java programming language, Proceedings of the 2004 ACM symposium on Applied computing. Pizza GJ JSR-000014 JDK1.5 Recently : push for simplifying/eliminatingwildcards!!! TSP: Software Engineering

  4. 1 A Generic Swap: in differentlanguages template <class T> void swap( T& a, T& b){ T tmp = a; a = b; b = tmp; } sub swap {@_[0, 1] = @_[1, 0]} • staticvoid Swap<T>(ref T a, ref T b){T temp = a;a = b;b = temp;} let swap (a,b) = (b,a) QUESTION: do yourecogniseany of these? TSP: Software Engineering

  5. 1 A Generic Swap: in differentlanguages generictype Swap_Typeisprivate; -- GenericparameterprocedureGeneric_Swap(Left : in out Swap_Type; Right : in out Swap_Type);procedureGeneric_Swap(Left : in out Swap_Type; Right : in out Swap_Type) isTemp : Swap_Type := Left;beginLeft := Right;Right := Temp;end Generic_Swap; class Pair<T> {T first;T second;public static <T> void swap(Pair<T> p) {T temp = p.first;p.first = p.second;p.second = temp;} } QUESTION: do yourecogniseany of these? TSP: Software Engineering

  6. 1 Why are genericsuseful Re-usable patterns (likehigherorderfunctions): foldl (+) 0 [1..5] = 15 foldl (append) "" ["a", "b", "c"] = “abc” filter (odd) [1,3,5,2,4] = [1,3,5] filter (animal) [cow, dog, cake] = [cow, dog] map (double) [1,3,5,2,4] = [2,6,10,4,8] map (capitalize) [“aBc”, “BBc”] = [“ABC”, “BBC”] QUESTION: what are the types of these 3 functions? TSP: Software Engineering

  7. 1 Why are genericsuseful Re-usable data structures, egbinarytree of things: Withgenericalgorithms/functions, egdepth TSP: Software Engineering

  8. 1 Why are genericsuseful • Re-usable classes, eg (ordered) list of things: • Combines generic data and genericfunctions in a genericclass • Unconstrainedgenericity– no restriction on type/class of genericparameter • Constrainedgenericity– the genericparameter must be a type/class whichis a subtype/subclass of a specified class • NOTE: Genericityisusuallyextended to allow multiple genericparameters (but thentheymay/may not bemutuallyconstrained) TSP: Software Engineering

  9. 1 Why are genericsuseful: a classic Java example List myIntList = new LinkedList(); myIntList.add(new Integer(0)); Integer x = (Integer) myIntList.iterator().next(); List<Integer> myIntList = new LinkedList<Integer>(); myIntList.add(new Integer(0)); Integer x = myIntList.iterator().next(); QUESTION: Which code do youprefer, and why? NOTE: The 2ndexample uses the Java List collections class TSP: Software Engineering

  10. Why are genericsuseful: Java List example, continued: public interface List<E> { voidadd(E x); Iterator<E> iterator(); } The declaration of the formal type parameters of the interface List You might imaginethat an IntegerList defined as List<Integer> stands for a version of List where E has been uniformly replaced by Integer: public interface IntegerList { voidadd(Integer x) Iterator<Integer> iterator(); } This intuition may be useful, but it may also be misleading. (This is closer to the type of macro expansion in the C++ STL) TSP: Software Engineering

  11. Java genericsimplemented by erasure Generics are implemented by the Java compiler as a front-end conversion called erasure. You can (almost) think of it as a source-to-source translation (syntactic sugar), whereby the generic version of code is converted to the non-generic version. As a result, the type safety and integrity of the Java virtual machine are never at risk, even in the presence of unchecked warnings. Basically, erasure gets rid of (or erases) all generic type information. All the type information between angle brackets is thrown out, so, for example, a parameterized type like List<String> is converted into List. All remaining uses of type variables are replaced by the upper bound of the type variable (usually Object). And, whenever the resulting code isn’t type-correct, a cast to the appropriate type is inserted. TSP: Software Engineering

  12. How To ImplementGenerics – manychoices (seereferencedpapers) While generics look like the C++ templates, it is important to note that they are not (implemented) the same. Java generics simply provide compile-time type safety and eliminate the need for casts. Generics use a technique known as type erasure as described above, and the compiler keeps track of the generics internally, and all instances use the same class file at compile/run time. A C++ template on the other hand is just a fancy macro processor; whenever a template class is instantiated with a new class, the entire code for the class is reproduced and recompiled for the new class. TSP: Software Engineering

  13. Some Java “Details” : all instances of a generic class have the same run-time class • What does the following code fragment print? • List <String> l1 = new ArrayList<String>(); • List <Integer> l2 = new ArrayList<Integer>(); • System.out.println(l1.getClass() == l2.getClass()); • It prints true, because all instances of a generic class have the same run-time class, regardless of their actual type parameters. • As consequence, the static variables and methods of a class are also shared among • all the instances. That is why it is illegal to refer to the type parameters of a type • declaration in a static method or initializer, or in the declaration or initializer of a static variable. TSP: Software Engineering

  14. Generics and Subtyping QUESTION: What does the following code output? class Animal{} class Dog extends Animal{ } publicclassInheritanceTester { privatestaticvoid message(Collection<Animal> animals) { System.out.println("You gave me a collection of animals."); } privatestaticvoid message(Object object) { System.out.println("You gave me an object."); } publicstaticvoid main(String[] args) { List<Dog> animals = newArrayList<Dog>(); message(animals); } } TSP: Software Engineering

  15. Generics and Subtyping In general, if Foo is a subtype (subclass or subinterface) of Bar, and G is some generic type declaration, it is not the case that G<Foo> is a subtype of G<Bar>. All OO languages handle the integration of genericity and subclassing differently This is probably the hardest thing you need to learn about (Java) generics … and how it relates to the concept of wildcards TSP: Software Engineering

  16. Generics and Subtyping Example: drawingshapes in a canvas • Typically , adrawingwillcontain a number of shapes. Assumingthat theshapes are stored in a list, itwouldbeconvenient to have a method in Canvasthatdrawsthem all: public voiddrawAll(List<Shape> shapes) { for (Shape s: shapes) { s.draw(this); } } Now, the type rules (as wesaw on previousslide) saythatdrawAll() canonlybecalled on lists of exactly Shape: itcannot, for instance, becalled on a List<Circle>. That isunfortunate, since all the methoddoesisreadshapesfrom the list, soitcouldjust as wellbecalled on a List<Circle>… Java wildcardswereintroduced to overcomethisproblem. TSP: Software Engineering

  17. Wildcards – drawingshapes in a canvas Whatwereallywantis for the method to accept a list of anykind of shape: public voiddrawAll(List<? extends Shape> shapes) { ... } There is a small but very important differencehere: we have replaced the type List<Shape> with List<? extends Shape>. NowdrawAll() willacceptlists of anysubclass of Shape (or Shape itself), sowecannow call it on a List<Circle> if wewant. List<? extends Shape> is an example of a boundedwildcard. Wesaythat Shape is the upperbound of the wildcard. TSP: Software Engineering

  18. Java Wildcards • There are three types of wildcards in Java: • "? extends Type": Denotes a family of subtypes of type Type. This is the most useful wildcard • "? super Type": Denotes a family of supertypes of type Type. • "?": Denotes the set of all types or any Question: can you think of a use of the second wildcard type? TSP: Software Engineering

  19. Problem: Implement a Pair Of Thingsin Java You are to code the class GenericPair, suchthatit passes the tests written in JUnit_GenericPairTest(whichcanbedownloadedfrom the module web site). TSP: Software Engineering

  20. Problem: Implement a Pair Of Thingsin Java The test variables TSP: Software Engineering

  21. Problem: Implement a Pair Of Thingsin Java The tests: testToString Tests methodGenericPair.toString() testSwap_static Tests methodGenericPair.swap(GenericPair) testSwap Tests methodGenericPair.swap() testCopyConstructor Tests methodGenericPair.GenericPair(GenericPair) testEquals Tests methodGenericPair.equals(java.lang.Object) TSP: Software Engineering

  22. Problem: Implement a Pair Of Thingsin Java TO DO: Write the GenericPairsothat the tests are successful TSP: Software Engineering

  23. Problem: Implement a Pair Of Thingsin Java TO DO: Write the GenericPairsothat the tests are successful You shouldconsider the test code to specify the requirements. For example, youcandeducethatyouneedconstructors: TSP: Software Engineering

  24. Problem: Implement a Pair Of Thingsin Java (usinggenerics) TO DO: Write the GenericPairsothat the tests are successful For example, youcanalsodeducethatyouneed 2 swap methods: QUESTION: Whatothermethods do youneed? TSP: Software Engineering

  25. Problem: Implement a Pair Of Thingsin Java (withoutgenerics) Let us consider how wecould do thiswithout the generictemplates One suchapproachis to use the base class Object publicinterfacePairSpecification { Public void swap(); public Object getFirst(); public Object getSecond(); publicvoidsetFirst(Object o); publicvoidsetSecond(Object o); public String toString (); publicbooleanequals(Object obj); } TSP: Software Engineering

  26. Problem: Implement a Pair Of Integersin Java (3 designs) PairSpecification Pair Of Things PairAbstraction Pair Of Integers GenericPair <Integer> PairOfIntegersAbstraction ArrayList <Integer> Integer 2 PairOfIntegers1 PairOfIntegers3 PairOfIntegers2 User definedgenerics Library generics No generics TSP: Software Engineering

  27. Problem: Implement a Pair Of Thingsin Java publicabstractclassPairAbstractionimplementsPairSpecification{ publicabstract Object getFirst(); publicabstract Object getSecond(); publicabstractvoidsetFirst(Object o); publicabstractvoidsetSecond(Object o); TSP: Software Engineering

  28. Problem: Implement a Pair Of Thingsin Java publicvoid swap(){ Object temp = getFirst(); setFirst(getSecond()); setSecond(temp); } public String toString (){ return"("+getFirst()+","+getSecond()+")"; } TSP: Software Engineering

  29. Problem: Implement a Pair Of Thingsin Java publicbooleanequals(Object obj){ if (this == obj) returntrue; if (obj == null) returnfalse; if (!(objinstanceofPairSpecification)) returnfalse; PairAbstractionother = (PairAbstraction) obj; return (other.getFirst() == getFirst() && other.getSecond() == getSecond()); } } TSP: Software Engineering

  30. Problem: Implement a Pair Of Integersin Java publicabstractclassPairOfIntegersAbstractionextendsPairAbstractionimplementsPairSpecification{ publicstaticfinalintDEFAULT_FIRST =0; publicstaticfinalintDEFAULT_SECOND =0; publicabstractvoidsetFirst(Object o); publicabstractvoidsetSecond(Object o); publicabstractIntegergetFirst(); publicabstractIntegergetSecond(); TSP: Software Engineering

  31. Problem: Implement a Pair Of Integersin Java publicPairOfIntegersAbstraction(){ setFirst(DEFAULT_FIRST); setSecond (DEFAULT_SECOND); } publicPairOfIntegersAbstraction(PairOfIntegersAbstractionpoi){ setFirst(poi.getFirst()); setSecond(poi.getSecond()); } publicPairOfIntegersAbstraction(Integer first, Integer second){ setFirst(first); setSecond(second); } } TSP: Software Engineering

  32. Problem: Implement a Pair Of Integersin Java (2. withoutgenerics) publicclass PairOfIntegers2 extendsPairOfIntegersAbstractionimplementsHasInvariant, PairSpecification{ Integerfirst; Integersecond; public PairOfIntegers2(){super();} public PairOfIntegers2(PairOfIntegers2 poi){super(poi);} public PairOfIntegers2(Integer first, Integer second){ super(first,second); } publicIntegergetFirst() {returnfirst;} publicIntegergetSecond() {returnsecond;} TSP: Software Engineering

  33. Problem: Implement a Pair Of Integersin Java (2. withoutgenerics) publicvoidsetFirst(Object o) throwsIllegalArgumentException{ if (!( o instanceof Integer))throw (newIllegalArgumentException("Can't assign a non Integer")); first = (Integer) o; } publicvoidsetSecond(Object o) throwsIllegalArgumentException { if (!( o instanceof Integer)) throw (newIllegalArgumentException("Can't assign a non Integer")); second = (Integer) o; } } // endclass PairOfIntegers2 TSP: Software Engineering

  34. Problem: Implement a Pair Of Integersin Java (2. withoutgenerics) TO DO: Run the Unit tests and check that the implementationis correct. QUESTION: Do youunderstand how the Unit tests work, whatthey are testing and whythey are structured as they are? TSP: Software Engineering

  35. Problem: Implement a Pair Of Integers(1. using user definedgenerics) Wecanalsochoose to implement the PairOfIntegersusing the generic pair as follows: publicclass PairOfIntegers1 extendsPairOfIntegersAbstractionimplementsPairSpecification{ GenericPair <Integer> pairIntegers; /* TO DO – complete the code here in orderthat the unit tests in JUnit_PairOfIntegers1Testpass. The Unit test code canbedownloadedfrom the web site } TSP: Software Engineering

  36. Problem: Implement a Pair Of Integers(1. using user definedgenerics) TO DO: Implement and test a class PairOfIntegers1 TSP: Software Engineering

  37. Problem: Implement a Pair Of Integers(3. usinglibrarygenerics) Wecanalsochoose to implement the PairOfIntegersusing the genericlibrariesas follows: publicclass PairOfIntegers3 extendsPairOfIntegersAbstractionimplementsPairSpecification{ ArrayList <Integer> pair; /* TO DO – complete the code here in orderthat the unit tests in JUnit_PairOfIntegers3Testpass. The Unit test code canbedownloadedfrom the web site } TSP: Software Engineering

  38. Problem: Implement a Pair Of Integers(1. using user definedgenerics) TO DO: Implement and test a class PairOfIntegers3 TSP: Software Engineering

More Related