Javaのgenericsの代入の可否

Javaのgenericsを使っているとき、どれからどれへの代入が可能かこんがらがるときがあるので、それ用のメモです。

```java
public class LearnGenericsAssignment {
    static class Func<T> {
        T item;
        public T getItem() { return item; }
        public void setItem(T item) { this.item = item; }
    }

    public void func() {
        Func<Object> objFunc = new Func<>();
        Func<Number> numFunc = new Func<>();
        Func<Double> douFunc = new Func<>();
        Func<? extends Object> exObjFunc = new Func<>();
        Func<? extends Number> exNumFunc = new Func<>();
        Func<? extends Double> exDouFunc = new Func<>();
        Func<? super Object> suObjFunc = new Func<>();
        Func<? super Number> suNumFunc = new Func<>();
        Func<? super Double> suDouFunc = new Func<>();

//      numFunc = objFunc;       // error
        numFunc = numFunc;
//      numFunc = douFunc;       // error
//      numFunc = exObjFunc;     // error
//      numFunc = exNumFunc;     // error
//      numFunc = exDouFunc;     // error
//      numFunc = suObjFunc;     // error
//      numFunc = suNumFunc;     // error
//      numFunc = suDouFunc;     // error

//      exNumFunc = objFunc;     // error
        exNumFunc = numFunc;
        exNumFunc = douFunc;
//      exNumFunc = exObjFunc;   // error
        exNumFunc = exNumFunc;
        exNumFunc = exDouFunc;
//      exNumFunc = suObjFunc;   // error
//      exNumFunc = suNumFunc;   // error
//      exNumFunc = suDouFunc;   // error

        suNumFunc = objFunc;
        suNumFunc = numFunc;
//      suNumFunc = douFunc;     // error
//      suNumFunc = exObjFunc;   // error
//      suNumFunc = exNumFunc;   // error
//      suNumFunc = exDouFunc;   // error
        suNumFunc = suObjFunc;
        suNumFunc = suNumFunc;
//      suNumFunc = suDouFunc;   // error
    }

    public void nestedFunc() {
        Func<Func<Object>> objFunc = new Func<>();
        Func<Func<Number>> numFunc = new Func<>();
        Func<Func<Double>> douFunc = new Func<>();
        Func<Func<? extends Object>> exObjFunc = new Func<>();
        Func<Func<? extends Number>> exNumFunc = new Func<>();
        Func<Func<? extends Double>> exDouFunc = new Func<>();
        Func<Func<? super Object>> suObjFunc = new Func<>();
        Func<Func<? super Number>> suNumFunc = new Func<>();
        Func<Func<? super Double>> suDouFunc = new Func<>();

//      numFunc = objFunc;       // error
        numFunc = numFunc;
//      numFunc = douFunc;       // error
//      numFunc = exObjFunc;     // error
//      numFunc = exNumFunc;     // error
//      numFunc = exDouFunc;     // error
//      numFunc = suObjFunc;     // error
//      numFunc = suNumFunc;     // error
//      numFunc = suDouFunc;     // error

//      exNumFunc = objFunc;     // error
//      exNumFunc = numFunc;     // error
//      exNumFunc = douFunc;     // error
//      exNumFunc = exObjFunc;   // error
        exNumFunc = exNumFunc;
//      exNumFunc = exDouFunc;   // error
//      exNumFunc = suObjFunc;   // error
//      exNumFunc = suNumFunc;   // error
//      exNumFunc = suDouFunc;   // error

//      suNumFunc = objFunc;     // error
//      suNumFunc = numFunc;     // error
//      suNumFunc = douFunc;     // error
//      suNumFunc = exObjFunc;   // error
//      suNumFunc = exNumFunc;   // error
//      suNumFunc = exDouFunc;   // error
//      suNumFunc = suObjFunc;   // error
        suNumFunc = suNumFunc;
//      suNumFunc = suDouFunc;   // error
    }
}
```