├── 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 | 
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 super Integer> 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