OCP

Generics

Did you know that:

  • classes used as generic type parameters possibly have nothing to do with each other.
public class Store<T>{...}
Store<Candy> candyStore = new Store<>{};
Store<Animal> animalStore = new Store<>{};
  • Type erasure is removing the generics syntax from your code at compile time.
public static  <E> boolean containsSomeThing(E [] listOfThings, E someThing){
    for (E e : listOfThings){
        if(e.equals(someThing)){
            return true;
        }
    }
    return false;
}


Compiles To:

public static <E> boolean containsSomeThing(E[] listOfThings, E someThing) {
    Object[] var1 = listOfThings;
    int var2 = listOfThings.length;

    for(int var3 = 0; var3 < var2; ++var3) {
        E e = var1[var3];
        if (e.equals(someThing)) {
            return true;
        }
    }

    return false;
}
  • a generic interface can be implemented in 3 different ways:
public interface Eatable<T>{
    void eat(T t);
}

//Food class that only works with apples
class Food implements Eatable<Apple>{
    public void eat(Apple a){}
}

//Food class that allows to specify the generic parameter
class Food<U> implements Eatable<U>{
    public void eat(U t){}
}

//Not using generics (compiler warning)
class Food implements Eatable{
    public void eat(Object t){}
}
  • you CANNOT:
    • call new T() cause that would be creating a new Object()
    • do private T[] e = new T[10];
    • use a primative type as type parameter cause these are not objects
    • call instanceof because it after compilation List<Animal> looks the same as List<Boats>
  • this code will not compile because line 4 breaks the promise of adding Doubles:
List<Double> doubles = new ArrayList<>();
doubles.add(new Double(1.1));
List<Object> objectes = doubles;
objects.add("a string");
  • this code won’t either because java does not know the type of the lions List when trying to add a new lion or cat:
static class Lion extends Cat {}
static class Cat {}

public static void min(String... args){
    List<? extends Lion> lions = new ArrayList<Lion>();
    lions.add(new Lion());
    lions.add(new Cat());
}

If you want to dive into Java Generics challenge yourself by understanding this blog on Generics and Java8.

 

Leave a Reply

Your email address will not be published.