Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Java Generics - Basics

Java Generics - Basics

Basics of java generics such as wild-cards and bounded types.

Avatar for bangarharshit

bangarharshit

September 06, 2017

More Decks by bangarharshit

Other Decks in Programming

Transcript

  1. public static <T extends Object & Comparable<? super T>> T

    max(Collection<? extends T> coll) {
 Iterator<? extends T> i = coll.iterator();
 T candidate = i.next();
 
 while (i.hasNext()) {
 T next = i.next();
 if (next.compareTo(candidate) > 0)
 candidate = next;
 }
 return candidate;
 } 2 Collections.max
  2. public static <T extends Object & Comparable<? super T>> T

    max(Collection<? extends T> coll) {
 Iterator<? extends T> i = coll.iterator();
 T candidate = i.next();
 
 while (i.hasNext()) {
 T next = i.next();
 if (next.compareTo(candidate) > 0)
 candidate = next;
 }
 return candidate;
 } 3 Collections.max
  3. 4

  4. 7 Basics - Visibility public class OuterClass<T> {
 
 public

    class InnerClass {
 private List<T> someVariable;
 }
 }
  5. 8 Basics - Visibility public class OuterClass<T> {
 
 public

    static class InnerStaticClass {
 private List<T> someVariable;
 } private InnerStaticClass<T> innerStaticClass = new InnerStaticClass<>(); 
 }
  6. 9 Basics - Visibility public class OuterClass<T> {
 
 public

    static class InnerStaticClass<T> {
 private List<T> someVariable;
 } private InnerStaticClass<T> innerStaticClass = new InnerStaticClass<>(); 
 }
  7. 10 Basics - Visibility public class OuterClass<T> {
 
 public

    void someMethod() {
 List<T> list = new ArrayList<T>();
 }
 }
  8. 11 Basics - Visibility public class OuterClass<T> {
 
 public

    static void someStaticMethod(List<T> list) {
 }
 
 public void someMethod() {
 List<T> list = new ArrayList<T>();
 someStaticMethod(list);
 }
 }
  9. 12 Basics - Visibility public class OuterClass<T> {
 
 public

    static <T> void someStaticMethod(List<T> list) {
 }
 
 public void someMethod() {
 List<T> list = new ArrayList<T>();
 someStaticMethod(list);
 }
 }
  10. 16 Sub-Types public class Fruit {
 
 public static class

    Apple extends Fruit {
 
 }
 
 public static class Strawberry extends Fruit {
 
 }
 
 public static class FujiApple extends Apple {
 
 }
 
 public static void main(String[] args) {
 Fruit fruit = new Apple();
 }
 }
  11. 17 Sub-Types public class Fruit {
 
 public static class

    Apple extends Fruit {
 
 }
 
 public static class Strawberry extends Fruit {
 
 }
 
 public static class FujiApple extends Apple {
 
 }
 
 public static void main(String[] args) {
 Fruit fruit = new Apple();
 }
 }
  12. 18 Sub-Types public class Fruit {
 
 public static void

    main(String[] args) {
 Fruit[] fruit = new Apple()[]{};
 }
 }
  13. 19 Sub-Types public class Fruit {
 
 public static void

    main(String[] args) {
 List<Fruit> fruit = new ArrayList<Apple>();
 }
 }
  14. 20 Sub-Types public class Fruit {
 
 public static void

    main(String[] args) {
 Apple[] apples = new Apple[]{new Apple(), new Apple()};
 Fruit[] fruits = apples;
 fruits[0] = new Strawberry(); // Runtime exception.
 } 
 }
  15. 21 Wild-cards public class Fruit {
 
 public static void

    main(String[] args) {
 List<Fruit> fruit = new ArrayList<Apple>();
 }
 }
  16. 22 Wild-cards public class Fruit {
 
 public static void

    main(String[] args) {
 List<? extends Fruit> fruit = new ArrayList<Apple>();
 }
 }
  17. 24 Wild-cards public interface Fruit {
 
 Juice produceJuice();
 


    class Juice { }
 
 static List<Juice> juice(List<Fruit> fruits) {
 return fruits
 .stream()
 .map(fruit -> fruit.produceJuice())
 .collect(Collectors.toList());
 }
 
 class Apple implements Fruit {
 
 @Override
 public Juice produceJuice() {
 return new Juice();
 }
 }
 
 class Banana implements Fruit {
 
 @Override
 public Juice produceJuice() {
 return new Juice();
 }
 }
 
 public static void main(String[] args) {
 List<Fruit> fruits = ...;
 List<Banana> bananas = ...;
 juice(fruits);
 juice(bananas);
 }
 }
  18. 25 Wild-cards public interface Fruit {
 
 Juice produceJuice();
 


    class Juice { }
 
 static List<Juice> juice(List<Fruit> fruits) {
 return fruits
 .stream()
 .map(fruit -> fruit.produceJuice())
 .collect(Collectors.toList());
 }
 
 class Apple implements Fruit {
 
 @Override
 public Juice produceJuice() {
 return new Juice();
 }
 }
 
 class Banana implements Fruit {
 
 @Override
 public Juice produceJuice() {
 return new Juice();
 }
 }
 
 public static void main(String[] args) {
 List<Fruit> fruits = ...;
 List<Banana> bananas = ...;
 juice(fruits);
 juice(bananas);
 }
 }
  19. 26 Wild-cards public interface Fruit {
 
 Juice produceJuice();
 


    class Juice { }
 
 static List<Juice> juice(List<Fruit> fruits) {
 return fruits
 .stream()
 .map(fruit -> fruit.produceJuice())
 .collect(Collectors.toList());
 }
 
 class Apple implements Fruit {
 
 @Override
 public Juice produceJuice() {
 return new Juice();
 }
 }
 
 class Banana implements Fruit {
 
 @Override
 public Juice produceJuice() {
 return new Juice();
 }
 }
 
 public static void main(String[] args) {
 List<Fruit> fruits = ...;
 List<Banana> bananas = ...;
 juice(fruits);
 juice(bananas);
 }
 }
  20. 27 Wild-cards public interface Fruit {
 
 Juice produceJuice();
 


    class Juice { }
 
 static List<Juice> juice(List<Fruit> fruits) {
 return fruits
 .stream()
 .map(fruit -> fruit.produceJuice())
 .collect(Collectors.toList());
 }
 
 class Apple implements Fruit {
 
 @Override
 public Juice produceJuice() {
 return new Juice();
 }
 }
 
 class Banana implements Fruit {
 
 @Override
 public Juice produceJuice() {
 return new Juice();
 }
 }
 
 public static void main(String[] args) {
 List<Fruit> fruits = ...;
 List<Banana> bananas = ...;
 juice(fruits);
 juice(bananas);
 }
 }
  21. 28 Wild-cards public interface Fruit {
 
 Juice produceJuice();
 


    class Juice { }
 
 static List<Juice> juice(List<Fruit> fruits) {
 return fruits
 .stream()
 .map(fruit -> fruit.produceJuice())
 .collect(Collectors.toList());
 }
 
 class Apple implements Fruit {
 
 @Override
 public Juice produceJuice() {
 return new Juice();
 }
 }
 
 class Banana implements Fruit {
 
 @Override
 public Juice produceJuice() {
 return new Juice();
 }
 }
 
 public static void main(String[] args) {
 List<Fruit> fruits = ...;
 List<Banana> bananas = ...;
 juice(fruits);
 juice(bananas);
 }
 }
  22. 29 Wild-cards public interface Fruit {
 
 Juice produceJuice();
 


    class Juice { }
 
 static List<Juice> juice(List<? extends Fruit> fruits) {
 return fruits
 .stream()
 .map(fruit -> fruit.produceJuice())
 .collect(Collectors.toList());
 }
 
 class Apple implements Fruit {
 
 @Override
 public Juice produceJuice() {
 return new Juice();
 }
 }
 
 class Banana implements Fruit {
 
 @Override
 public Juice produceJuice() {
 return new Juice();
 }
 }
 
 public static void main(String[] args) {
 List<Fruit> fruits = ...;
 List<Banana> bananas = ...;
 juice(fruits);
 juice(bananas);
 }
 }
  23. 31 Wild-cards public interface Fruit {
 
 
 class Apple

    implements Fruit { }
 
 class Banana implements Fruit { }
 
 public static void main(String[] args) {
 List<? extends Fruit> fruits = ...;
 fruits.add(new Banana());
 }
 }
  24. 32 Wild-cards public interface Fruit {
 
 
 class Apple

    implements Fruit { }
 
 class Banana implements Fruit { }
 
 public static void main(String[] args) {
 List<? extends Fruit> fruits = new ArrayList<Apple>();
 fruits.add(new Banana());
 }
 }
  25. 33 Wild-cards public interface Fruit {
 
 
 class Apple

    implements Fruit { }
 
 class Banana implements Fruit { }
 
 public static void main(String[] args) {
 List<? extends Fruit> fruits = ...;
 Fruit fruit = fruits.get(9);
 }
 }
  26. 34 Wild-cards public interface Fruit {
 
 
 class Apple

    implements Fruit { }
 
 class Banana implements Fruit { }
 
 public static void main(String[] args) {
 List<? extends Fruit> fruits = ...;
 Fruit fruit = fruits.get(9);
 }
 }
  27. 35 Wild-cards public interface Fruit {
 
 
 class Apple

    implements Fruit { }
 
 class Banana implements Fruit { }
 
 public static void main(String[] args) {
 List<? extends Fruit> fruits = new ArrayList<Apple>();
 Fruit fruit = fruits.get(9);
 }
 }
  28. 36 Wild-cards public interface Fruit {
 
 
 class Apple

    implements Fruit { }
 
 class Banana implements Fruit { }
 
 public static void main(String[] args) {
 List<? Fruit> fruits = new ArrayList<Apple>();
 Fruit fruit = fruits.get(9);
 }
 }
  29. 38 Wild-cards public interface Fruit {
 
 public static class

    Apple implements Fruit { }
 
 public static class Banana implements Fruit { }
 
 public static void main(String[] args) {
 List<? super Apple> apple = new ArrayList<Apple>();
 apple.add(new Apple());
 Apple appleGet = apple.get(0);
 }
 }
  30. 39 Wild-cards public interface Fruit {
 
 public static class

    Apple implements Fruit { }
 
 public static class Banana implements Fruit { }
 
 public static void main(String[] args) {
 List<? super Apple> apple = new ArrayList<Fruit>();
 apple.add(new Apple());
 Apple appleGet = apple.get(0);
 }
 }
  31. 40 Wild-cards public interface Fruit {
 
 public static class

    Apple implements Fruit { }
 
 public static class Banana implements Fruit { }
 
 public static void main(String[] args) {
 List<? super Apple> apple = new ArrayList<Object>();
 apple.add(new Apple());
 Apple appleGet = apple.get(0);
 }
 }
  32. 41 Wild-cards public interface Fruit {
 
 public static class

    Apple implements Fruit { }
 
 public static class Banana implements Fruit { }
 
 public static void main(String[] args) {
 List<? super Apple> apple = new ArrayList<Object>();
 apple.add(new Apple());
 Apple appleGet = apple.get(0);
 }
 }
  33. 42 Wild-cards public interface Fruit {
 
 public static class

    Apple implements Fruit { }
 
 public static class Banana implements Fruit { }
 
 public static void main(String[] args) {
 List<? super Apple> apple = new ArrayList<Apple>();
 apple.add(new Apple());
 Apple appleGet = apple.get(0);
 }
 }
  34. 43 Wild-cards static <E> void copy(List<E> src, List<E> dst) {


    for (E e : src) {
 dst.add(e);
 }
 }
  35. 44 Wild-cards static <E> void copy(List<? extends E> src, List<?

    super E> dst) { for (E e : src) {
 dst.add(e);
 }
 }
  36. 45 Wild-cards static <E> E max(List<? extends E> src, Comparator<E>

    comparator) {
 E candidate = src.iterator().next();
 for (E e : src) {
 candidate = comparator.compare(candidate, e) < 0 ? e : candidate ;
 }
 return candidate;
 }
  37. 46 Wild-cards static <E> E max(List<? extends E> src, Comparator<E>

    comparator) {
 E candidate = src.iterator().next();
 for (E e : src) {
 candidate = comparator.compare(candidate, e) < 0 ? e : candidate ;
 }
 return candidate;
 }
  38. 47 Wild-cards static <E> E max(List<? extends E> src, Comparator<E>

    comparator) {
 E candidate = src.iterator().next();
 for (E e : src) {
 candidate = comparator.compare(candidate, e) < 0 ? e : candidate ;
 }
 return candidate;
 }
  39. 48 Wild-cards static <E> E max(List<? extends E> src, Comparator<?

    super E> comparator) {
 E candidate = src.iterator().next();
 for (E e : src) {
 candidate = comparator.compare(candidate, e) < 0 ? e : candidate ;
 }
 return candidate;
 }
  40. 49 PECS (producer extends consumer super) • ? extends P

    -> If it is a producer or source • ? super P -> if it is a sink or consumer
  41. 49 PECS (producer extends consumer super) • ? extends P

    -> If it is a producer or source • ? super P -> if it is a sink or consumer • P -> If it is both a sink and source
  42. 50 Bounded-types public class Fruit implements Comparable<Fruit> {
 
 @Override


    public int compareTo(Fruit o) {
 return 0;
 }
 
 public static Comparable max(List<? extends Comparable> fruits) {
 Comparable candidate = fruits.iterator().next();
 
 for (Comparable fruit : fruits) {
 candidate = fruit.compareTo(candidate) < 0 ? candidate : fruit;
 }
 
 return candidate;
 }
 }

  43. 51 Bounded-types public class Fruit implements Comparable<Fruit> {
 
 @Override


    public int compareTo(Fruit o) {
 return 0;
 }
 
 public static Comparable max(List<? extends Comparable> fruits) {
 Comparable candidate = fruits.iterator().next();
 
 for (Comparable fruit : fruits) {
 candidate = fruit.compareTo(candidate) < 0 ? candidate : fruit;
 }
 
 return candidate;
 }
 }

  44. 52 Bounded-types public class Fruit implements Comparable<Fruit> {
 
 @Override


    public int compareTo(Fruit o) {
 return 0;
 }
 
 public static Comparable max(List<? extends Comparable> fruits) {
 Comparable candidate = fruits.iterator().next();
 
 for (Comparable fruit : fruits) {
 candidate = fruit.compareTo(candidate) < 0 ? candidate : fruit;
 }
 
 return candidate;
 }
 }

  45. 53 Bounded-types public class Fruit implements Comparable<Fruit> {
 
 @Override


    public int compareTo(Fruit o) {
 return 0;
 }
 
 public static <T extends Comparable> T max(List<T> fruits) {
 T candidate = fruits.iterator().next();
 
 for (T fruit : fruits) {
 candidate = fruit.compareTo(candidate) < 0 ? candidate : fruit;
 }
 
 return candidate;
 }
 }

  46. 54 Bounded-types public class Fruit implements Comparable<Fruit> {
 
 @Override


    public int compareTo(Fruit o) {
 return 0;
 }
 
 public static <T extends Comparable<T>> T max(List<T> fruits) {
 T candidate = fruits.iterator().next();
 
 for (T fruit : fruits) {
 candidate = fruit.compareTo(candidate) < 0 ? candidate : fruit;
 }
 
 return candidate;
 }
 }

  47. 55 Bounded-types public class Fruit implements Comparable<Fruit> {
 
 @Override


    public int compareTo(Fruit o) {
 return 0;
 }
 
 public static <T extends Comparable<T>> T max(List<T> fruits) {
 T candidate = fruits.iterator().next();
 
 for (T fruit : fruits) {
 candidate = fruit.compareTo(candidate) < 0 ? candidate : fruit;
 }
 
 return candidate;
 }
 }

  48. 56 Bounded-types public abstract class Enum<E extends Enum<E>> implements Comparable<E>

    { }
 
 enum Color {RED, BLUE, GREEN}
 
 public final class Color extends Enum<Color> { } 

  49. 57 Bounded-types public abstract class Enum<E extends Enum<E>> implements Comparable<E>

    { }
 
 enum Color {RED, BLUE, GREEN}
 
 public final class Color extends Enum<Color> { } 

  50. 58 Bounded-types public abstract class Enum<E extends Enum<E>> implements Comparable<E>

    { }
 
 enum Color {RED, BLUE, GREEN}
 
 public final class Color extends Enum<Color> { } 

  51. public static <T extends Object & Comparable<? super T>> T

    max(Collection<? extends T> coll) {
 Iterator<? extends T> i = coll.iterator();
 T candidate = i.next();
 
 while (i.hasNext()) {
 T next = i.next();
 if (next.compareTo(candidate) > 0)
 candidate = next;
 }
 return candidate;
 } 59 Collections.max
  52. 61 Erasure Syntax Run-time int[] int[] List<T> (List<Integer>) List List<Integer>[]

    List[] int int Integer Integer T extends Comparable Comparable T extends Object & Comparable Object
  53. 62 Erasure class Overloaded {
 
 public static int sum(List<Integer>

    ints) {
 int sum = 0;
 for (int i : ints)
 sum += i;
 return sum;
 }
 
 public static String sum(List<String> strings) {
 StringBuffer sum = new StringBuffer();
 for (String s : strings)
 sum.append(s);
 return sum.toString();
 }
 }
  54. 63 Erasure class Overloaded {
 
 public static String sum(List<Integer>

    ints) {
 int sum = 0;
 for (int i : ints)
 sum += i;
 return String.valueof(sum);
 }
 
 public static String sum(List<String> strings) {
 StringBuffer sum = new StringBuffer();
 for (String s : strings)
 sum.append(s);
 return sum.toString();
 }
 }
  55. 64 Erasure class Overloaded {
 
 public static String sum(List

    ints) {
 int sum = 0;
 for (int i : ints)
 sum += i;
 return String.valueof(sum);
 }
 
 public static String sum(List strings) {
 StringBuffer sum = new StringBuffer();
 for (String s : strings)
 sum.append(s);
 return sum.toString();
 }
 }
  56. 65 Erasure class Integer implements Comparable<Integer>, Comparable<Long> {
 // compile-time

    error, cannot implement two interfaces with same erasure private final value;
 public Integer(int value) { this.value = value; }
 public int compareTo(Integer i) {
 return (value < i.value) ? -1 : (value == i.value) ? 0 : 1; }
 public int compareTo(Long l) {
 return (value < l.value) ? -1 : (value == l.value) ? 0 : 1; }
 }

  57. 66 Erasure class Integer implements Comparable, Comparable {
 // compile-time

    error, cannot implement two interfaces with same erasure private final value;
 public Integer(int value) { this.value = value; }
 public int compareTo(Integer i) {
 return (value < i.value) ? -1 : (value == i.value) ? 0 : 1; }
 public int compareTo(Long l) {
 return (value < l.value) ? -1 : (value == l.value) ? 0 : 1; }
 }

  58. public static <T extends Object & Comparable<? super T>> T

    max(Collection<? extends T> coll) {
 Iterator<? extends T> i = coll.iterator();
 T candidate = i.next();
 
 while (i.hasNext()) {
 T next = i.next();
 if (next.compareTo(candidate) > 0)
 candidate = next;
 }
 return candidate;
 } 67 Collections.max
  59. public class Fruit implements Comparable<Fruit> {
 
 public static class

    Apple extends Fruit { }
 
 public static <T extends Comparable<T>> T max(List<T> fruits) {
 
 ...
 }
 
 public static void main(String[] args) {
 List<Apple> apples = ...;
 max(apples);
 }
 } 68 Collections.max
  60. public class Fruit implements Comparable<Fruit> {
 
 public static class

    Apple extends Fruit implements Comparable<Apple> { }
 
 public static <T extends Comparable<T>> T max(List<T> fruits) {
 
 ...
 }
 
 public static void main(String[] args) {
 List<Apple> apples = ...;
 max(apples);
 }
 } 69 Collections.max
  61. public class Fruit implements Comparable<Fruit> {
 
 public static class

    Apple implements Comparable<Apple>, Comparable<Fruit> { }
 
 public static <T extends Comparable<T>> T max(List<T> fruits) {
 
 ...
 }
 
 public static void main(String[] args) {
 List<Apple> apples = ...;
 max(apples);
 }
 } 70 Collections.max
  62. public class Fruit implements Comparable<Fruit> {
 
 public static class

    Apple extends Fruit { }
 
 public static <T extends Comparable<? super T>> T max(List<T> fruits) {
 
 ...
 }
 
 public static void main(String[] args) {
 List<Apple> apples = ...;
 max(apples);
 }
 } 71 Collections.max
  63. public static <T extends Object & Comparable<? super T>> T

    max(Collection<? extends T> coll) {
 Iterator<? extends T> i = coll.iterator();
 T candidate = i.next();
 
 while (i.hasNext()) {
 T next = i.next();
 if (next.compareTo(candidate) > 0)
 candidate = next;
 }
 return candidate;
 } 72 Collections.max
  64. public static Object max(Collection coll) {
 Iterator<? extends T> i

    = coll.iterator();
 T candidate = i.next();
 
 while (i.hasNext()) {
 T next = i.next();
 if (next.compareTo(candidate) > 0)
 candidate = next;
 }
 return candidate;
 } 73 Collections.max
  65. public static <T extends Comparable<? super T> max(Collection<? extends T>

    coll) {
 Iterator<? extends T> i = coll.iterator();
 T candidate = i.next();
 
 while (i.hasNext()) {
 T next = i.next();
 if (next.compareTo(candidate) > 0)
 candidate = next;
 }
 return candidate;
 } 74 Collections.max
  66. 75 Erasure Syntax Run-time int[] int[] List<T> (List<Integer>) List List<Integer>[]

    List[] int int Integer Integer T extends Comparable Comparable T extends Object & Comparable Object
  67. public static <T extends Object & Comparable<? super T>> T

    max(Collection<? extends T> coll) {
 Iterator<? extends T> i = coll.iterator();
 T candidate = i.next();
 
 while (i.hasNext()) {
 T next = i.next();
 if (next.compareTo(candidate) > 0)
 candidate = next;
 }
 return candidate;
 } 76 Collections.max
  68. public class Fruit<T> {
 List<T> t;
 T t1;
 T[] t2;


    
 public Fruit() {
 t = new ArrayList<T>();
 t1 = new T();
 t2 = new T[]{ };
 }
 }
 
 77 Instance Creation
  69. public class Fruit<T> {
 List<T> t;
 T t1;
 T[] t2;


    
 public Fruit() {
 t = new ArrayList<T>();
 t1 = new T();
 t2 = new T[]{ };
 }
 }
 
 78 Instance Creation
  70. public void uncheckedCastWarning() {
 List<T> list = new ArrayList<T>();
 List

    objectList = list;
 List<T> genericsList = objectList;
 } 81 Unchecked cast warning
  71. 82

  72. • Effective Java - Chapter 5 • Java generics and

    collections - Naftalin 82 References
  73. • Effective Java - Chapter 5 • Java generics and

    collections - Naftalin • The gray blogspot 82 References
  74. • Effective Java - Chapter 5 • Java generics and

    collections - Naftalin • The gray blogspot • Angelika Langer’s blog 82 References