Java 泛型类型如何确保只添加正确类型的对象?

How do Java generics types ensure only the right type of object is added?

像 Arraylist 这样的泛型 class 如何确保在编译时擦除类型时只添加正确类型的对象?我知道 class cast 是由编译器添加的,但这似乎只适用于从 class 检索对象时。添加方法是否也有 class 转换?

让我们看看如何检查它。

Foo.java

public class Foo extends Bar { }

Baz.java

List<Bar> list = new ArrayList<>();
list.add(new Foo());
//list.add("boo"); ***ERROR***

在上面,编译器确保只添加 Bar。

编译后我们改Foo.java,单独编译:

Foo.java

public class Foo { }

当我们 运行 使用新的 Foo.class 时,我们可能会期望 ClassCastException 使用列表中的元素。添加可能不会引发异常,因为类型擦除只需要 Object。