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。
像 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。