This doesn't seem to have anything to do with type erasure, does it? It's needed for type-safe generics. Even without type erasure, you still need type safety. If your generics are always covariant (like Dart's are), you break type safety.
I think the mistake the Java designers made here was going with use-site variance instead of definition-site variance.