java 泛型 父类泛型能不能转换成子类泛型
时间: 2023-06-16 21:06:36 浏览: 149
java中获取泛型类的子类
在 Java 中,父类泛型不能直接转换成子类泛型。这是因为 Java 中的泛型是不可协变的,即使一个类型参数 `T` 是 `S` 的子类型,`List<T>` 也不是 `List<S>` 的子类型。例如,假设我们有以下类定义:
```
class Animal {}
class Dog extends Animal {}
```
现在我们定义一个 `List` 对象来保存 `Animal` 对象,然后尝试将其转换为 `List<Dog>`:
```
List<Animal> animals = new ArrayList<>();
List<Dog> dogs = (List<Dog>) animals; // 编译错误
```
上面的代码会在编译时出现错误,因为 `List<Animal>` 和 `List<Dog>` 是不兼容的类型。如果我们希望将 `List<Animal>` 转换为 `List<Dog>`,我们可以使用通配符:
```
List<Animal> animals = new ArrayList<>();
List<? extends Animal> dogs = animals;
```
这样我们就可以将 `animals` 赋值给 `dogs`,并且可以安全地通过 `dogs` 访问其中的 `Dog` 对象。但是,由于通配符的限制,我们不能向 `dogs` 中添加新的 `Dog` 对象。
阅读全文