Java泛型的总结
时间: 2023-07-08 13:17:28 浏览: 156
Java泛型是Java SE 5中引入的一项新特性,它提供了一种在编译时期进行类型检查和类型推断的机制,以避免在运行时期出现类型转换异常的问题。以下是Java泛型的总结:
1. 泛型类:定义一个泛型类,可以在类名后面加上一对尖括号,括号中放置类型参数。如:```class MyClass<T>{}```。
2. 泛型方法:定义一个泛型方法,可以在方法返回类型前面加上类型参数。如:```public <T> T myMethod(T t){}```。
3. 通配符:使用通配符“?”表示未知类型。如:```List<?> myList```。
4. 上界限制:使用extends关键字限制泛型类型的上界。如:```class MyClass<T extends Number>{}```。
5. 下界限制:使用super关键字限制泛型类型的下界。如:```class MyClass<T super Number>{}```。
6. 类型擦除:在编译时期,泛型类型会被擦除为原始类型,如```List<String>```会被擦除为```List```。
7. 限制泛型数组的创建:由于类型擦除的存在,无法直接创建泛型数组。如:```List<String>[] listArray = new List<String>[10];```是错误的。
总之,Java泛型提供了一种类型安全、灵活的编程方式,有助于提高代码的可读性、可维护性和可复用性。
相关问题
java 泛型 父类_java泛型基础、子类泛型不能转换成父类泛型--未完待续
在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中的泛型是不协变的,子类泛型不能转换成父类泛型。如果需要实现子类泛型转换成父类泛型,可以使用通配符来解决问题。
阅读全文