java 泛型 父类_java泛型基础、子类泛型不能转换成父类泛型--未完待续
时间: 2023-06-16 18:06:45 浏览: 103
在Java中,泛型是一种强类型机制,它可以让你在编译时检查类型错误,从而提高代码的安全性和可读性。在使用泛型时,我们经常会遇到父类和子类的泛型转换问题。
首先,我们需要明确一点:子类泛型不能转换成父类泛型。这是因为Java中的泛型是不协变的。例如,如果有一个类A和它的子类B,那么List<A>和List<B>之间是不存在继承关系的。
下面我们来看一个例子:
```java
public class Animal {
//...
}
public class Dog extends Animal {
//...
}
public class Test {
public static void main(String[] args) {
List<Animal> list1 = new ArrayList<>();
List<Dog> list2 = new ArrayList<>();
list1 = list2; // 编译错误
}
}
```
在这个例子中,我们定义了Animal类和它的子类Dog。然后我们定义了两个List,分别是List<Animal>和List<Dog>。如果将List<Dog>赋值给List<Animal>,会出现编译错误。这是因为List<Animal>和List<Dog>之间不存在继承关系。
那么,如果我们想要让子类泛型转换成父类泛型,应该怎么办呢?这时我们可以使用通配符来解决问题。通配符可以表示任意类型,包括父类和子类。例如,我们可以将List<Dog>赋值给List<? extends Animal>,这样就可以实现子类泛型转换成父类泛型了。
下面我们来看一个使用通配符的例子:
```java
public class Animal {
//...
}
public class Dog extends Animal {
//...
}
public class Test {
public static void main(String[] args) {
List<Animal> list1 = new ArrayList<>();
List<Dog> list2 = new ArrayList<>();
list1 = list2; // 编译错误
List<? extends Animal> list3 = new ArrayList<>();
list3 = list2; // 正确
}
}
```
在这个例子中,我们定义了List<? extends Animal>来表示任意继承自Animal的类型。然后我们将List<Dog>赋值给List<? extends Animal>,这样就可以实现子类泛型转换成父类泛型了。
总结一下,Java中的泛型是不协变的,子类泛型不能转换成父类泛型。如果需要实现子类泛型转换成父类泛型,可以使用通配符来解决问题。