diff --git a/src/com/oracle/java8/professional/GenericsTest.java b/src/com/oracle/java8/professional/GenericsTest.java index 0263686..8d8e571 100644 --- a/src/com/oracle/java8/professional/GenericsTest.java +++ b/src/com/oracle/java8/professional/GenericsTest.java @@ -1,8 +1,125 @@ package com.oracle.java8.professional; +import com.oracle.java8.professional.generics.*; + public class GenericsTest { public static void main(String[] args) { + doParameterClassTest(); + doParameterMethodTest(); + doRawParameterClassTest(); + doBoundariesParameterClassTest(); + doJollyParameterTest(); + doJollyParameterBounderiesTest(); + } + private static void doParameterClassTest() { + Pair p = new Pair<>(3, 5); + Integer n = p.getFirst(); + + Entry e = new Entry<>("Luigi", 35); + e.setFirst("Luigi Rossi"); + Integer n2 = e.getSecond(); + } + + private static void doParameterMethodTest() { + String[] arr = {"uno", "due", "tre"}; + String d = GenericsTest.getMedianObj(arr); + System.out.println(d); + + //A a = new A("Walter", 50); + //a.f("Skyler"); + //a.g(true); + + d = GenericsTest.getMedianObj(arr); + System.out.println(d); + } + + private static T getMedianObj(T[] a) { + return a[a.length/2]; + } + + private static void doRawParameterClassTest() { + Pair pInt = new Pair<>(); + + // da parametrica a grezza: warning + Pair pGrezza = pInt; + + // da grezza a parametrica: warning + Pair pStr = new Pair<>(); + + // da parametrica a parametrica (di tipo diverso): + // errore + //Pair pObj = pStr; + } + + private static void doBoundariesParameterClassTest() { + Pair p = new Pair<>("max", "min"); + System.out.println(getMax(p)); + } + + private static > T getMax(Pair p) { + if (p.getFirst().compareTo(p.getSecond()) <= 0) { + return p.getFirst(); + } else { + return p.getSecond(); + } + } + + private static void doJollyParameterTest() { + Pair p = new Pair<>("string", 10); + System.out.println(areEqual(p)); + + Pair p1 = new Pair(); // da grezza a jolly: ok + Pair p2 = new Pair(); // da parametrica a jolly: ok + + //p2.setFirst("Saul"); errore in compilazione + p2.setSecond(null); // ok + + //String s = p2.getFirst(); errore in compilazione + Object o = p2.getSecond(); // ok + } + + private static boolean areEqual(Pair p) { + return p.getFirst().equals(p.getSecond()); + } + + // E' evidente che da Java 8 non è più così + //public static void f(Pair p1, Pair p2) {} + //public static void f(Pair p1, Pair p2) {} + + private static void doJollyParameterBounderiesTest() { + Pair p1 = new Pair(); + Pair p2 = new Pair(); + Pair p3 = new Pair(); + Pair p4 = new Pair(); + Pair p5 = p1; + Pair p6 = p3; + + /*|------------------------------------------------------| + *| Tipo del riferimento | Tipo ass. get | parametro set | + *|----------------------|---------------|---------------| + *| A | Object | soltanto null | + *|----------------------|---------------|---------------| + *| A | X e super-tipi| soltanto null | + *|----------------------|---------------|---------------| + *| A | Object | X e sotto-tipi| + *|------------------------------------------------------| + */ + + Pair p7 = new Pair(); + //p7.setFirst(new Manager()); errore in compilazione + //Manager m = p7.getFirst(); errore in compilazione + Impiegato e1 = p7.getFirst(); + Persona e2 = p7.getFirst(); + p7.setFirst(null); + + Pair p8 = new Pair(); + p8.setFirst(new Impiegato()); + //p8.setSecond(new Persona()); errore di compilazione + //p8.setSecond(new Object()); errore di compilazione + p8.setSecond(new Manager()); + //Impiegato e2 = p8.getFirst(); errore di compilazione + Object o = p8.getFirst(); } } diff --git a/src/com/oracle/java8/professional/generics/A.java b/src/com/oracle/java8/professional/generics/A.java new file mode 100644 index 0000000..f0e74ac --- /dev/null +++ b/src/com/oracle/java8/professional/generics/A.java @@ -0,0 +1,10 @@ +package com.oracle.java8.professional.generics; + +public class A, U extends S> { + + public A(S s, T t) {} + + public void f(S s) {} + + public void g(T t) {} +} diff --git a/src/com/oracle/java8/professional/generics/ComparatorWithBoundaries.java b/src/com/oracle/java8/professional/generics/ComparatorWithBoundaries.java new file mode 100644 index 0000000..0cca02d --- /dev/null +++ b/src/com/oracle/java8/professional/generics/ComparatorWithBoundaries.java @@ -0,0 +1,8 @@ +package com.oracle.java8.professional.generics; + +import java.util.Comparator; + +public interface ComparatorWithBoundaries extends Comparator { + boolean isTop(T o); + boolean isBottom(T o); +} diff --git a/src/com/oracle/java8/professional/generics/Entry.java b/src/com/oracle/java8/professional/generics/Entry.java new file mode 100644 index 0000000..3006217 --- /dev/null +++ b/src/com/oracle/java8/professional/generics/Entry.java @@ -0,0 +1,28 @@ +package com.oracle.java8.professional.generics; + +public class Entry { + private S first; + private T second; + + public Entry(S first, T second) { + this.first = first; + this.second = second; + } + + public S getFirst() { + return first; + } + + public void setFirst(S first) { + this.first = first; + } + + public T getSecond() { + return second; + } + + public void setSecond(T second) { + this.second = second; + } +} + diff --git a/src/com/oracle/java8/professional/generics/Impiegato.java b/src/com/oracle/java8/professional/generics/Impiegato.java new file mode 100644 index 0000000..1676323 --- /dev/null +++ b/src/com/oracle/java8/professional/generics/Impiegato.java @@ -0,0 +1,3 @@ +package com.oracle.java8.professional.generics; + +public class Impiegato extends Persona {} diff --git a/src/com/oracle/java8/professional/generics/Manager.java b/src/com/oracle/java8/professional/generics/Manager.java new file mode 100644 index 0000000..8557a03 --- /dev/null +++ b/src/com/oracle/java8/professional/generics/Manager.java @@ -0,0 +1,3 @@ +package com.oracle.java8.professional.generics; + +public class Manager extends Impiegato {} diff --git a/src/com/oracle/java8/professional/generics/Pair.java b/src/com/oracle/java8/professional/generics/Pair.java new file mode 100644 index 0000000..6892860 --- /dev/null +++ b/src/com/oracle/java8/professional/generics/Pair.java @@ -0,0 +1,30 @@ +package com.oracle.java8.professional.generics; + +public class Pair { + private T first, second; + + public Pair() { + this(null, null); + } + + public Pair(T first, T second) { + this.first = first; + this.second = second; + } + + public T getFirst() { + return first; + } + + public void setFirst(T first) { + this.first = first; + } + + public T getSecond() { + return second; + } + + public void setSecond(T second) { + this.second = second; + } +} diff --git a/src/com/oracle/java8/professional/generics/Persona.java b/src/com/oracle/java8/professional/generics/Persona.java new file mode 100644 index 0000000..237b956 --- /dev/null +++ b/src/com/oracle/java8/professional/generics/Persona.java @@ -0,0 +1,3 @@ +package com.oracle.java8.professional.generics; + +public class Persona {} diff --git a/src/com/oracle/java8/professional/generics/Rational.java b/src/com/oracle/java8/professional/generics/Rational.java new file mode 100644 index 0000000..488eade --- /dev/null +++ b/src/com/oracle/java8/professional/generics/Rational.java @@ -0,0 +1,17 @@ +package com.oracle.java8.professional.generics; + +public class Rational implements Comparable { + private int num, denum; + + public Rational(int num, int denum) { + this.num = num; + this.denum = denum; + } + + @Override + public int compareTo(Rational r) { + if (num * r.denum > r.num * denum) return 1; + if (num * r.denum < r.num * denum) return -1; + return 0; + } +}