Java泛型

2023-11-28 11:47:07 浏览数 (2)

泛型技术对于Java开发来说十分重要,它可以帮助我们编写出型质和安全的代码。但和C 不同,Java采用了类型擦除机制实现泛型,这给开发带来一定困惑。本文将带你深入解读Java泛型与类型擦除,揭开这背后的奥妙之处。

Java泛型定义

在Java中,泛型是通过在类、接口或方法前添加类型参数来实现的,比如:

代码语言:java复制
public class Box<T> {
  // T stands for "Type"
  private T t;

  public void set(T t) {
    this.t = t; 
  }

  public T get() {
    return t;
  }
}

这里Box类定义了一个类型参数T,它表示Box内可以存储任何类型的对象。

类型擦除机制

然而,与C 不同的是,Java在编译期会将类型参数替换为最接近的非泛型类型,叫做类型擦除。

例如Box<Integer>在编译后变成:

代码语言:java复制
public class Box {
  private Object t;

  public void set(Object t) {...}

  public Object get() {...}  
}

类型参数都被擦除为Object类型。这意味着泛型信息在运行期丢失了。

类型擦除的影响

  • 不能用泛型类型做实例对象
  • 泛型方法无法检查参数类型
  • 泛型类无法保存类型信息
  • 数组不能指定泛型组件类型

不过,编译器会在编译期进行参数化类型检查,保证类型安全。

类型擦除的优点

  • 加载时间与内存占用更低
  • 泛型类能向后兼容非泛型环境
  • 泛型方法能重载非泛型方法
  • 泛型类保持与原有类的二进制兼容性

通过类型擦除,Java中泛型的设计既保证了向下兼容,又在编译期实现了类型检查,在安全与效率上取得很好的平衡。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞