ArrayList<Integer> a;
ArrayList<Integer> f() {return a;}
List<Integer> g() {return a;} // OK
List<Object> h() {return a;} // ダメ

いつからこのg()みたいなのおkになったの?
ジェネリクスの変性どうのというよりこれは単に
Derived d;
Base g() {return d;}
っていう風にとらえるだけのことで
実型パラメータ(一個目の例でのInteger)は無視しておkなの?