Skip to content

Commit 54cea15

Browse files
committed
Covariant Arrays
1 parent ca587b2 commit 54cea15

8 files changed

Lines changed: 99 additions & 22 deletions

File tree

src/main/java/com/ab/generics/basic/TypeSafeExample.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22

33
public class TypeSafeExample {
44
public static void main(String[] args) {
5-
GenericCircularBuffer<String> buffer = new GenericCircularBuffer<String>(10);
5+
GenericCircularBuffer<String> buffer = new GenericCircularBuffer<>(10);
66
buffer.offer("a");
77
buffer.offer("bc");
88
buffer.offer("d");
99

10-
//buffer.offer(1); //Leads to compile time error
10+
//buffer.offer(1); //compile time error
1111
String value = concatenate(buffer);
1212
System.out.println(value);
1313
}

src/main/java/com/ab/generics/basic/TypeUnsafeExample.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ public static void main(String[] args) {
77
buffer.offer("bc");
88
buffer.offer("d");
99

10-
//buffer.offer(1); //Leads to ClassCastException
10+
buffer.offer(1); //Leads to ClassCastException
1111
String value = concatenate(buffer);
1212
System.out.println(value);
1313
}

src/main/java/com/ab/generics/classes_and_interfaces/AgeComparator.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,13 @@ public class AgeComparator implements Comparator<Person> {
88

99
@Override
1010
public int compare(Person o1, Person o2) {
11-
return Integer.compare(o1.getAge(),o2.getAge());
12-
//return -1 * Integer.compare(o1.getAge(),o2.getAge()); for sorting in descending order
11+
//ascending order
12+
//return Integer.compare(o1.getAge(),o2.getAge());
13+
//or
14+
return o1.getAge() - o2.getAge();
15+
//descending order
16+
//return -1 * Integer.compare(o1.getAge(),o2.getAge());
17+
//or
18+
//return o2.getAge() - o1.getAge();
1319
}
1420
}

src/main/java/com/ab/generics/collections/ListExamples.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ public static void main(String[] args) {
1111
Person donDrapper = new Person("Don Drapper", 89);
1212
Person peggyOlson = new Person("Peggy Olson", 65);
1313

14-
List<Person> madMen = new ArrayList<Person>();
14+
List<Person> madMen = new ArrayList<>();
1515
madMen.add(donDrapper);
1616
madMen.add(peggyOlson);
1717

1818
System.out.println(madMen);
1919

2020
madMen.add(new Person("Bert Cooper", 100));
21-
//madMen.add(new Object());
21+
//madMen.add(new Object());//compile error
2222
System.out.println(madMen);
2323

2424
for (int i = 0; i < madMen.size(); i++) {

src/main/java/com/ab/generics/erasure/Legacy.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public static void main(String[] args) {
2020
List<Integer> integers = new ArrayList();
2121
integers = list;
2222
List<String> strings = new ArrayList();
23-
//list = strings;
23+
list = strings;
2424

2525
Iterator iterator = list.iterator();
2626
while (iterator.hasNext()){

src/main/java/com/ab/generics/methods/ListMinimumGeneric.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,22 @@ public static void main(String[] args) {
2020

2121
System.out.println(madMen);
2222

23-
final Person youngestPerson = min(madMen, new AgeComparator());
23+
//final Person youngestPerson = min(madMen, new AgeComparator());
2424

2525
/*final Person youngestPerson = min(madMen, new Comparator<Integer>() {
2626
@Override
2727
public int compare(Integer o1, Integer o2) {
2828
return 0;
2929
}
30-
});*/ //leads to compile time error
30+
});*/ //compile error
31+
32+
final Person youngestPerson = min(madMen, new Comparator<Person>() {
33+
@Override
34+
public int compare(Person o1, Person o2) {
35+
return o1.getAge() - o2.getAge();
36+
}
37+
});
38+
3139
System.out.println(youngestPerson);
3240

3341
List<Integer> numbers = new ArrayList<>();
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.ab.generics.wildcard;
2+
3+
4+
import java.util.ArrayList;
5+
import java.util.Arrays;
6+
import java.util.List;
7+
8+
/**
9+
* @author Arpit Bhardwaj
10+
*
11+
* Arrays Are Covariant in java means
12+
*
13+
* an array of type T[] may contain elements of type T or any subtype of T.
14+
* an array S[] is a subtype of the array T[] if S is a subtype of T
15+
*
16+
* Arrays are of Refiable Type
17+
*/
18+
public class CovariantArrays {
19+
public static void main(String[] args) {
20+
Number[] numbers = new Number[3];
21+
//Integer, Float, Double are subtype of Number
22+
numbers[0] = new Integer(10);
23+
numbers[1] = new Float(10);
24+
numbers[2] = new Double(3);
25+
26+
System.out.println(Arrays.toString(numbers));
27+
28+
Integer[] integers = new Integer[3];
29+
Number[] numbers2 = integers;
30+
31+
//numbers2[0] = 3.2;//java.lang.ArrayStoreException
32+
33+
System.out.println(Arrays.toString(numbers2));
34+
35+
List<Integer> integers3 = new ArrayList<>();
36+
integers3.add(1);
37+
integers3.add(2);
38+
//List<Number> myNums = integers; //compiler error as generic types are non-reifiable
39+
40+
//due to above behavior of generics in collection we are losing the power of polymorphism
41+
//In order to overcome above limitation and support polymorphism in generic world
42+
//generics came up with the concept of covariance and contravariance.
43+
44+
//contra variance (upper bound) (read, but not write.)
45+
//number3 accepts elements of Number Type or any subclasses of Number
46+
List<? extends Number> numbers3 = new ArrayList<Integer>();
47+
Number n1 = numbers3.get(0);
48+
//numbers3.add(2);//compile error
49+
50+
//covariance (lower bound) (write, but not read.)
51+
//number4 accepts elements of Integer Type or any super classes of Integer
52+
List<? super Integer> numbers4 = new ArrayList<Number>();
53+
//Number n2 = numbers4.get(0);//compile error
54+
numbers4.add(2);
55+
//numbers4.add(1.0);//compile error
56+
57+
}
58+
}

src/main/java/com/ab/generics/wildcard/Unbounded.java

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,27 +9,32 @@
99
* @author Arpit Bhardwaj
1010
*/
1111
public class Unbounded {
12+
1213
public static void main(String[] args) {
1314
List<Object> objects = new ArrayList<>();
15+
objects.add(1);
16+
objects.add("abc");
1417
objects.add(new Object());
1518
objects.add(new Person("Nish", 28));
1619
System.out.println(objects);
1720

21+
22+
//the only value pass through ? is null
23+
List<?> objects2 = new ArrayList<>();
24+
objects2.add(null);
1825
//Compile time error
19-
/*List<?> objects2 = new ArrayList<>();
20-
objects2.add(new Object());
21-
objects2.add(new Person("Nish", 28));
22-
System.out.println(objects2);*/
23-
24-
//As adding use contra variance
25-
List<? super Object> objects2 = new ArrayList<>();
26-
objects2.add(new Object());
27-
objects2.add(new Person("Nish", 28));
26+
//objects2.add(1);
27+
//objects2.add("abc")
28+
//objects2.add(new Object());
29+
//objects2.add(new Person("Nish", 28));
2830
System.out.println(objects2);
2931

30-
//the only value pass through ? is null
31-
List<?> objects3 = new ArrayList<>();
32-
objects3.add(null);
32+
//As adding use contravariance
33+
List<? super Object> objects3 = new ArrayList<>();
34+
objects3.add(new Object());
35+
objects3.add(new Person("Nish", 28));
3336
System.out.println(objects3);
37+
38+
3439
}
3540
}

0 commit comments

Comments
 (0)