? 結局全部Objectになるんだから、共変反変できたって実装上は何の問題もないでしょ
C#4.0は型パラメータを含む型自体に制限をかけることで
タイプセーフな共変反変を実現してる(IEnumerable<out T>やIComparer<in T>など)
Javaはジェネリック型を利用する側で制限をかけてるから
広く柔軟に共変反変を適用できるメリットはあるけどとにかく分かりにくすぎる