面试题:简述 Java 泛型解析以及实现原理等 ?

1. 泛型的定义

  • 泛型(Generics) 是 Java 5 引入的特性,允许在定义类、接口和方法时使用类型参数。
  • 泛型的核心目的是提高代码的复用性和类型安全性
  • 示例:
public class Box<T> {
    private T value;

    public void setValue(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }
}

2. 泛型的作用

  • 类型安全:在编译时检查类型,避免运行时类型转换错误。
  • 代码复用:通过类型参数化,实现代码的通用性。
  • 减少强制类型转换:泛型可以避免显式的类型转换。

3. 泛型的实现原理

  • 类型擦除(Type Erasure)
    • Java 泛型是通过类型擦除实现的,即在编译时将所有泛型类型参数替换为它们的上限(默认是 Object)。
    • 如果泛型类型参数有上限(如 <T extends Number>),则替换为上限类型(如 Number)。
    • 示例:
public class Box<T> {
    private T value;
    // 编译后:private Object value;
}
  • 桥方法(Bridge Methods)
    • 为了保证泛型类型擦除后的多态性,编译器会生成桥方法。
    • 示例:
public interface Comparable<T> {
    int compareTo(T o);
}

public class MyClass implements Comparable<MyClass> {
    @Override
    public int compareTo(MyClass o) {
        // 实现逻辑
    }
}

4. 泛型的限制

  • 基本类型不能作为泛型参数
    • 泛型类型参数必须是引用类型,不能是基本类型(如 intchar)。
    • 解决方案:使用包装类(如 IntegerCharacter)。
  • 不能创建泛型类型的实例
    • 由于类型擦除,无法直接创建泛型类型的实例。
    • 示例:T obj = new T(); // 错误
  • 不能创建泛型数组
    • 由于类型擦除,无法直接创建泛型数组。
    • 示例:T[] array = new T[10]; // 错误

5. 泛型的通配符

  • <?>:无界通配符,表示任意类型。
  • <? extends T>:上界通配符,表示 T 或其子类型。
  • <? super T>:下界通配符,表示 T 或其父类型。
  • 示例:
public void printList(List<?> list) {
    for (Object item : list) {
        System.out.println(item);
    }
}

6. 泛型的应用场景

  • 集合类:如 List<T>Map<K, V>
  • 工具类:如 Comparator<T>Callable<T>
  • 自定义泛型类和接口:如 Box<T>

示例代码

public class GenericExample {
    public static void main(String[] args) {
        Box<Integer> intBox = new Box<>();
        intBox.setValue(10);
        System.out.println(intBox.getValue()); // 输出:10

        Box<String> strBox = new Box<>();
        strBox.setValue("Hello");
        System.out.println(strBox.getValue()); // 输出:Hello
    }
}

class Box<T> {
    private T value;

    public void setValue(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }
}

总结

  • 泛型 是 Java 中用于实现类型参数化的特性,提高代码的复用性和类型安全性。
  • 实现原理:通过类型擦除在编译时将泛型类型参数替换为上限类型,并生成桥方法保证多态性。
  • 限制:不能使用基本类型、不能创建泛型类型实例和数组。
  • 通配符<?><? extends T><? super T> 用于增强泛型的灵活性。
THE END
点赞8 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容