Java Generics: What it is and How to Implement it


Published on

Generics are facilities of generic programming that was added to the Java programming language in 2004 as part of J2SE 5.0. They allow "a type or method to operate on objects of various types while providing compile-time type safety." This report presents an overview on how Generics are implemented in Java.

Published in: Education
  • Be the first to comment

  • Be the first to like this

No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide

Java Generics: What it is and How to Implement it

  1. 1. Generics в Java
  2. 2. Generics в Java 1. Простые generic-и1.List strList = new ArrayList();2.strList.add("some text");3.// ??!! O_o4.strList.add(new Integer(0));5.String str = (String)strList.get(0);6.// ClassCastException7.Integer i = (Integer)strList.get(0);
  3. 3. Generics в Java 1. Простые generic-и1.List<String> strList = new ArrayList<String>();2.strList.add("some text");3.strList.add(new Integer()); // сообщение об ошибке компилятора4.String str = strList.get(0);5.Integer i = strList.get(0); //сообщение об ошибке компилятора
  4. 4. Generics в Java 1. Простые generic-и1.class GenericList<E>{2. E getFirst() { ... }3. void add(E obj) { ... }4.}1.GenericList<String> genericList = new GenericList<String>();
  5. 5. Generics в Java 2. Generic-методы1.public class CreateAnArrayList {2. public <T> void makeArrayList(T t) { // take an object of an3. // unknown type and use a4. // "T" to represent the type5. List<T> list = new ArrayList<T>(); // now we can create thellist using "T"6. list.add(t);7. }8.}1.public void makeArrayList(Integer t) {2. List<Integer> list = new ArrayList<Integer>();3. list.add(t);4.}
  6. 6. Generics в Java 2. Generic-методы1.public class GenMethDemo {2.// Determine if an object is in an array.3.static <T> boolean isIn(T x, T[] y) {4. for(int i=0; i < y.length; i++)5. if(x.equals(y[i])) return true;6. return false;7.}8.public static void main(String args[]) {9. // Use isIn() on Integers.10. Integer nums[] = { 1, 2, 3, 4, 5 };11. if(isIn(2, nums))12. System.out.println("2 is in nums");13. // Use isIn() on Strings.14. String strs[] = { "one", "two", "three", "four", "five" };15. if(isIn("two", strs))16. System.out.println("two is in strs");17. // Opps! Won"t compile! Types must be compatible.18. if(isIn("two", nums))19. System.out.println("two is in strs");20. }21.}
  7. 7. Generics в Java 3. Маски (wildcards)•Предположим, у нас есть функция, которая находит ближайший кточке Glyph из заданной коллекции. Glyph – это базовый тип, и можетиметься неограниченное количество потомков этого типа. Такжеможет иметься неограниченное количество коллекций, хранящихэлементы, тип которых соответствует одному из этих потомков.Хотелось бы, чтобы функция могла работать со всеми подобнымиколлекциями, и возвращала элемент, тип которого совпадал бы стипом элемента коллекции, а не приводился к Glyph.
  8. 8. Generics в Java 3. Маски (wildcards)1.<T> T findNearest(Collection<T> glyphs, int x, int y) { ... }1.<T extends Glyph> T findNearest(Collection<T> glyphs, int x, int y) {...}
  9. 9. Generics в Java 3. Маски (wildcards)class <T extends Glyph & MoveableGlyph> MoveableGlyphsContainterstatic <T, V extends T> boolean isIn(T x, V[] y) {...}
  10. 10. Generics в Java 3. Маски (wildcards)1.public interface Box<T> {2. public T get();3. public void put(T element);4.}1.public void unbox(Box<?> box) {2. System.out.println(box.get());//Так можно3. box.put(new Object());//Так нельзя4. box.put(box.get());//Так тоже нельзя5. System.out.println(box.toString());//Так можно6.}
  11. 11. Generics в Java 4. Хорошо и плохо1.class FooEverythingDoer2.{3....4.Map<String, String> getProperties(Foo foo) {...}5.void putProperties(Foo foo, Map<String, String> properties) {...}6.Map<Foo, Map<String, String>> getPropertiesBatch(Iterable<Foo> foos) {...}7.Foo findByProperties(Map<String, String> partOfProperties) {...}8....9.}1.class Properties extends Map<String,String> {2. (constructors matching super here)3.}1.class FooEverythingDoer {2. ...3. Properties getProperties(Foo foo) {...}4. void putProperties(Foo foo, Properties properties) {...}5. Map<Foo, Properties> getPropertiesBatch(Iterable<Foo> foos) {...}6. Foo findByProperties(Properties partOfProperties) {...}7. ...8.}
  12. 12. Generics в Java 4. Хорошо и плохо1. Map<Integer, List<String>> namesById = new HashMap<Integer, List<String>>();1.public class CollectionFactory2.{3.public static <K,V> Map<K,V> newMap()4.{5. return new HashMap<K,V>();6.}7.}8.import static CollectionUtils.newMap;9.Map<Integer, List<String>> namesById = newMap();
  13. 13. Generics в Java 5. Примеры