├── README.md ├── pom.xml └── src └── main └── java └── examples ├── BoundedTypeParameter.java ├── Box.java ├── Example.java ├── Example2.java ├── GenericAndMethods.java ├── GenericType.java ├── GenericsAndClasses.java ├── Letter.java ├── LowerBoundedWildcards.java ├── Phone.java ├── TypeErasure.java ├── UnboundedWildcards.java └── UpperBoundedWildcards.java /README.md: -------------------------------------------------------------------------------- 1 | # Java Generics Course 2 | 3 | ![cover](https://user-images.githubusercontent.com/40702606/99153052-dfb78780-269d-11eb-8841-09e5adc12455.png) 4 | 5 | As a Java software engineer is important to know how to write generic algorithms to write clean and re usable api's. Java Generics has been introduce remove unnecessary casting which cause lots of problems in the past. 6 | 7 | In this course your will fully grasp the following topic: 8 | 9 | - Generic Classes and Interfaces and Methods 10 | - Bounded Type Parameters 11 | - Lower and Upper Bounded Wildcards 12 | - Naming Conventions 13 | - Type Erasure 14 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | org.example 8 | JavaGenerics 9 | 1.0-SNAPSHOT 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/main/java/examples/BoundedTypeParameter.java: -------------------------------------------------------------------------------- 1 | package examples; 2 | 3 | public class BoundedTypeParameter { 4 | public static void main(String[] args) { 5 | Integer[] numbers = {1, 2, 3}; 6 | System.out.println( 7 | countGreaterThan(numbers, 0) 8 | ); 9 | 10 | Double[] numbers2 = {1.0, 2.0, 3.8}; 11 | System.out.println( 12 | countGreaterThan(numbers2, .9) 13 | ); 14 | } 15 | 16 | interface A {} 17 | interface B {} 18 | 19 | static > int countGreaterThan( 20 | T[] numbers, 21 | T number) { 22 | int count = 0; 23 | for (T n : numbers) { 24 | if (n.compareTo(number) > 0) { 25 | count++; 26 | } 27 | } 28 | return count; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/examples/Box.java: -------------------------------------------------------------------------------- 1 | package examples; 2 | 3 | public class Box { 4 | 5 | private T t; 6 | 7 | public void set(T t) { 8 | this.t = t; 9 | } 10 | 11 | public T get() { 12 | return this.t; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/examples/Example.java: -------------------------------------------------------------------------------- 1 | package examples; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class Example { 7 | public static void main(String[] args) { 8 | List numbers = new ArrayList(); 9 | numbers.add(1); 10 | // numbers.add("2"); 11 | for (Object number : numbers) { 12 | System.out.println((String) number); 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/examples/Example2.java: -------------------------------------------------------------------------------- 1 | package examples; 2 | 3 | public class Example2 { 4 | public static void main(String[] args) { 5 | // Comparable number = 10; 6 | // number.compareTo("10"); 7 | Comparable number = 10; 8 | System.out.println(number.compareTo(9)); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/examples/GenericAndMethods.java: -------------------------------------------------------------------------------- 1 | package examples; 2 | 3 | public class GenericAndMethods { 4 | public static void main(String[] args) { 5 | String ali = "Ali"; 6 | String[] names = {ali, "jamila"}; 7 | Character[] letters = {'A', 'B', 'C'}; 8 | Integer[] numbers = {1, 2, 4, 5, 5}; 9 | 10 | print(names); 11 | print(letters); 12 | print(numbers); 13 | } 14 | 15 | static void print(T[] array) { 16 | for (T e : array) { 17 | System.out.println( 18 | e.getClass().getName() + 19 | " - " + e 20 | ); 21 | } 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/examples/GenericType.java: -------------------------------------------------------------------------------- 1 | package examples; 2 | 3 | import java.awt.*; 4 | import java.util.ArrayList; 5 | import java.util.HashMap; 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | public class GenericType { 10 | public static void main(String[] args) { 11 | // List 12 | List names = 13 | new ArrayList<>(); 14 | names.add("1"); 15 | List numbers = 16 | new ArrayList<>(); 17 | numbers.add(1); 18 | 19 | // Map 20 | Map map = 21 | new HashMap<>(); 22 | 23 | Map map2 = 24 | new HashMap<>(); 25 | 26 | /* 27 | Naming Convention 28 | E – Element (used extensively by the Java Collections Framework, for example ArrayList, Set etc.) 29 | K – Key (Used in Map) 30 | N – Number 31 | T – Type 32 | V – Value (Used in Map) 33 | */ 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/examples/GenericsAndClasses.java: -------------------------------------------------------------------------------- 1 | package examples; 2 | 3 | import java.util.Date; 4 | 5 | public class GenericsAndClasses { 6 | public static void main(String[] args) { 7 | Box box = new Box<>(); 8 | box.set(new Phone("Samsung")); 9 | System.out.println(box.get()); 10 | 11 | Box box2 = new Box<>(); 12 | box2.set(new Letter("Amigoscode")); 13 | System.out.println(box2.get()); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/examples/Letter.java: -------------------------------------------------------------------------------- 1 | package examples; 2 | 3 | public class Letter { 4 | 5 | private final String sender; 6 | 7 | public Letter(String sender) { 8 | this.sender = sender; 9 | } 10 | 11 | public String getSender() { 12 | return sender; 13 | } 14 | 15 | @Override 16 | public String toString() { 17 | return "Letter{" + 18 | "sender='" + sender + '\'' + 19 | '}'; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/examples/LowerBoundedWildcards.java: -------------------------------------------------------------------------------- 1 | package examples; 2 | 3 | import java.util.Arrays; 4 | import java.util.List; 5 | 6 | public class LowerBoundedWildcards { 7 | public static void main(String[] args) { 8 | // ? Wildcards 9 | // Lower Bounded Wildcards 10 | List list2 = Arrays.asList(1, 2); 11 | List list3 = Arrays.asList(); 12 | printNumbers(list2); 13 | printNumbers(list3); 14 | } 15 | 16 | static void printNumbers(List list) { 17 | list.forEach(e -> { 18 | System.out.println(e.getClass().getName()); 19 | System.out.println(e); 20 | }); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/examples/Phone.java: -------------------------------------------------------------------------------- 1 | package examples; 2 | 3 | public class Phone { 4 | 5 | private final String brand; 6 | 7 | public Phone(String brand) { 8 | this.brand = brand; 9 | } 10 | 11 | public String getBrand() { 12 | return brand; 13 | } 14 | 15 | @Override 16 | public String toString() { 17 | return "Phone{" + 18 | "brand='" + brand + '\'' + 19 | '}'; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/examples/TypeErasure.java: -------------------------------------------------------------------------------- 1 | package examples; 2 | 3 | public class TypeErasure { 4 | 5 | public class Node { 6 | 7 | private T data; 8 | private Node next; 9 | 10 | public Node(T data, Node next) { 11 | this.data = data; 12 | this.next = next; 13 | } 14 | 15 | public T getData() { return data; } 16 | // ... 17 | } 18 | 19 | /* 20 | public class Node { 21 | 22 | private Object data; 23 | private Node next; 24 | 25 | public Node(Object data, Node next) { 26 | this.data = data; 27 | this.next = next; 28 | } 29 | 30 | public Object getData() { return data; } 31 | // ... 32 | } 33 | */ 34 | 35 | } 36 | 37 | -------------------------------------------------------------------------------- /src/main/java/examples/UnboundedWildcards.java: -------------------------------------------------------------------------------- 1 | package examples; 2 | 3 | import java.util.Arrays; 4 | import java.util.Date; 5 | import java.util.List; 6 | 7 | public class UnboundedWildcards { 8 | public static void main(String[] args) { 9 | // ? Wildcards 10 | // Unbounded Wildcards 11 | List list1 = Arrays.asList("11", 2, new Date()); 12 | List list2 = Arrays.asList(1, 2); 13 | List list3 = Arrays.asList("1", "2"); 14 | print(list1); 15 | print(list2); 16 | print(list3); 17 | } 18 | 19 | static void print(List list) { 20 | list.forEach(e -> { 21 | System.out.println(e.getClass().getName()); 22 | System.out.println(e); 23 | }); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/examples/UpperBoundedWildcards.java: -------------------------------------------------------------------------------- 1 | package examples; 2 | 3 | import java.util.Arrays; 4 | import java.util.List; 5 | 6 | public class UpperBoundedWildcards { 7 | public static void main(String[] args) { 8 | // ? Wildcards 9 | // Upper Bounded Wildcards 10 | List list1 = Arrays.asList(1.9, 1.3); 11 | List list2 = Arrays.asList(1, 2); 12 | List list3 = Arrays.asList(); 13 | printNumbers(list1); 14 | printNumbers(list2); 15 | printNumbers(list3); 16 | } 17 | 18 | static void printNumbers(List list) { 19 | list.forEach(e -> { 20 | System.out.println(e.getClass().getName()); 21 | System.out.println(e); 22 | }); 23 | } 24 | } 25 | --------------------------------------------------------------------------------