Java泛型

举报
赵KK日常技术记录 发表于 2023/11/28 14:05:55 2023/11/28
【摘要】 泛型技术对于Java开发来说十分重要,它可以帮助我们编写出型质和安全的代码。但和C++不同,Java采用了类型擦除机制实现泛型,这给开发带来一定困惑。本文将带你深入解读Java泛型与类型擦除,揭开这背后的奥妙之处。 Java泛型定义在Java中,泛型是通过在类、接口或方法前添加类型参数来实现的,比如:public class Box<T> { // T stands for "Type" ...

泛型技术对于Java开发来说十分重要,它可以帮助我们编写出型质和安全的代码。但和C++不同,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>在编译后变成:

public class Box {
  private Object t;

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

  public Object get() {...}  
}

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

类型擦除的影响

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

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

类型擦除的优点

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

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

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。