Java 泛型了解么?什么是类型擦除?介绍一下常用的通配符?
时间: 2023-09-14 18:03:51 浏览: 115
Java泛型是Java 5.0引入的一个新特性,它提供了一种类型安全的编程方式,可以在编译期间检查代码的类型安全性,减少了运行时异常的发生。Java泛型通过将类型参数化来实现,可以在定义类、接口、方法时使用泛型。
但是,在Java泛型中,存在一个重要的概念,那就是类型擦除。类型擦除是Java泛型的实现方式之一,它的原理是在编译期间将泛型类型擦除,将泛型类型的变量替换成相应的类型,这样就可以在运行时使用普通的类型来代替泛型类型。类型擦除的好处是可以兼容以前的代码,但是它也存在一些局限性,例如无法获取泛型类型的具体信息等。
Java泛型中还有一个重要的概念是通配符,通配符可以用来表示任意类型,常用的通配符有以下三种:
1. <? extends T>:表示类型的上界,表示包括 T 在内的所有 T 的子类。
2. <? super T>:表示类型的下界,表示包括 T 在内的所有 T 的父类。
3. <?>:表示不确定的类型,表示任意类型。
通配符可以用在泛型对象的声明、方法的参数和返回值等地方,可以更加灵活地使用泛型类型。
总的来说,Java泛型是Java中的一个重要特性,它可以提高程序的可读性、可维护性和类型安全性。在使用Java泛型的过程中,需要注意类型擦除的影响和通配符的使用方式,以充分发挥Java泛型的优势。
相关问题
Java 泛型了解么?泛型的作用?什么是类型擦除?泛型有哪些限制?介绍一下常用的通配符
### Java 泛型概念及其作用
Java中的泛型提供了一种安全的方式来处理对象集合,允许编写能够操作多种数据类型的通用算法。通过引入类型参数`T`来表示不确定的具体类型,在定义类、接口或方法时可以不绑定到特定的数据类型[^1]。
#### 优点
- **类型安全性**:减少了强制转换的需求并防止运行时期间可能出现的ClassCastException异常。
- **可重用性和灵活性**:使得代码更加灵活多变,适用于不同种类的对象而无需重复编码逻辑。
### 类型擦除原理
类型擦除是指在编译期间移除了所有关于实际使用的具体类型的信息,并将其替换为最接近公共父级(通常是Object)。这意味着一旦经过编译期之后,虚拟机中就不存在任何有关于泛型的实际类型信息了;相反地,所有的实例都被视为它们各自的原始类型[^3]。
这种设计决策有助于保持向后兼容性的同时简化字节码结构,因为旧版本JVM并不支持泛型语法特性。然而这也意味着无法创建带有确切参数化的数组(`new ArrayList<String>[10]`),并且不允许静态字段依赖于类型变量。
### 泛型限制
由于存在上述提到的类型擦除过程,因此有一些重要的约束条件需要注意:
- **不能使用基本数据类型作为类型实参**:比如`ArrayList<int>`是非法语句,应该改写成包装类形式如`ArrayList<Integer>`.
- **无法实例化类型参数**:即像`t=new T();`这样的表达式会被认为错误,除非借助反射API.
- **构造函数也不能接受未限定的通配符**, 即`<?>`仅限于局部变量声明或者方法签名内.
### 常用通配符
为了增强泛型系统的表达能力,Java提供了两种主要类型的通配符:“?”代表未知类型,“extends”和“super”则用来指定上下边界范围:
- `?`: 表达任意未知类型, 可以读取但不可修改容器内的元素 (只读).
```java
List<?> list = new ArrayList<>();
Object obj = list.get(0); // OK: Reading is allowed
```
- `? extends Type`: 定义了一个上限继承关系链表,表明此位置上的类型要么就是Type本身或者是它的某个子类别成员之一
```java
List<? extends Number> numbers;
Integer i = numbers.get(0); // Possible if the actual type argument is Integer or its subclass
```
- `? super Type`: 设定了下限超类关联列表,说明此处所指代的是Type或是更广泛的祖先节点
```java
List<? super Integer> integersOrSuperTypes;
integersOrSuperTypes.add(new Integer(5)); // Adding an element of lower bound type is safe
```
阅读全文