面试题:请解释Java中的泛型(Generics)及其类型擦除(Type Erasure)的概念,并说明如何使用通配符(Wildcard)和边界(Bounds)来增强泛型的灵活性。答案:

泛型(Generics)的概念

泛型是Java语言的一种特性,它允许在编译时定义类、接口和方法的类型参数,从而实现代码的复用和类型安全。通过泛型,可以编写更加通用和安全的代码。

类型擦除(Type Erasure)的概念

类型擦除是Java泛型实现的一种机制。在编译时,泛型类型参数会被擦除,并替换为它们的上限(通常是Object),除非指定了上限。类型擦除确保了泛型代码与非泛型代码的兼容性。

通配符(Wildcard)和边界(Bounds)的使用

通配符和边界可以用来增强泛型的灵活性,主要有以下几种形式:

  1. 无界通配符(Unbounded Wildcard)
    • 使用?表示无界通配符,表示可以是任何类型。
    • 适用于只读操作,不适用于写操作。
    • 示例:List<?> list = new ArrayList<String>();
  2. 上界通配符(Upper Bounded Wildcard)
    • 使用? extends T表示上界通配符,表示类型必须是TT的子类。
    • 适用于读操作,不适用于写操作。
    • 示例:List<? extends Number> list = new ArrayList<Integer>();
  3. 下界通配符(Lower Bounded Wildcard)
    • 使用? super T表示下界通配符,表示类型必须是TT的父类。
    • 适用于写操作,不适用于读操作。
    • 示例:List<? super Integer> list = new ArrayList<Number>();
  4. 边界通配符(Bounded Wildcard)
    • 使用? extends T? super T表示边界通配符,可以指定类型的上限或下限。
    • 示例:List<? extends Comparable<?>> list = new ArrayList<String>();
示例

以下是一个简单的示例,展示了如何使用泛型、通配符和边界:

import java.util.ArrayList; 
import java.util.List; 
 
public class GenericsExample {
    public static void main(String[] args) {
        // 无界通配符 
        List<?> list1 = new ArrayList<String>();
        // list1.add("Hello");  // 编译错误,不能添加元素 
 
        // 上界通配符 
        List<? extends Number> list2 = new ArrayList<Integer>();
        // list2.add(123);  // 编译错误,不能添加元素 
        Number number = list2.get(0);  // 可以读取元素 
 
        // 下界通配符 
        List<? super Integer> list3 = new ArrayList<Number>();
        list3.add(123);  // 可以添加元素 
        // Integer integer = list3.get(0);  // 编译错误,不能保证类型安全 
 
        // 边界通配符 
        List<? extends Comparable<?>> list4 = new ArrayList<String>();
        // list4.add("Hello");  // 编译错误,不能添加元素 
        Comparable<?> comparable = list4.get(0);  // 可以读取元素 
    }
}

在这个示例中,我们展示了如何使用无界通配符、上界通配符、下界通配符和边界通配符来增强泛型的灵活性。

总结

泛型通过类型参数提供了代码的复用和类型安全。类型擦除是Java泛型的实现机制,确保了泛型代码与非泛型代码的兼容性。通配符和边界可以用来增强泛型的灵活性,适用于不同的使用场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡子发芽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值