Start here. This is the direct spoken answer to practice first.
Overview
The clearest explanation shows the type-safety failure Java prevents rather than treating invariance as an arbitrary rule.
Integer is a subtype of Number, but List<Integer> is not a subtype of List<Number> because Java generics are invariant. If that assignment were allowed, code holding the List<Number> reference could add a Double to a list that promises to contain only integers. The original caller would then retrieve a value under a false type guarantee. Invariance prevents that unsafe write at compile time.