java泛型知多少

Java 泛型了解么?

泛型是一种在编译时提供类型安全检查的机制,可以增加我们代码的可读性和安全性。泛型可以在编译时期对泛型参数进行校验来指定选入对象的类型,比如 ArrayList<Person> persons = new ArrayList<Person>() 这行代码就指明了该 ArrayList 对象只能传入 Person 对象,如果传入其他类型的对象就会报错。

什么是类型擦除?

类型擦除是Java泛型的一个重要概念,它指的是泛型信息只在编译阶段存在,在进入JVM之前,与类型相关的信息会被擦除掉,或者说被替换掉。这意味着泛型类(擦除后我们称之为原始类)和非泛型类在运行时实际上是相同的类。

Java 为什么要选择类型擦除这种实现方式?

类型擦除其实一直为我们程序员所诟病,给我们带了一些不必要的麻烦,那为什么还有选择类型擦除呢,其目的是为了向低版本兼容

类型擦除导致了哪些弊端?

泛型信息真的就没了吗?

并不是,泛型信息消失只是对于jvm而言,它会存储在。class文件中,这意味着我们可以通过反射去恢复这些泛型信息。

介绍⼀下常⽤的通配符?

问号通配符 ? 表示未知类型 。通配符可用于参数、字段、局部变量和返回类型。可以近似的理解为泛型的泛型

  • 通配符匹配出来的泛型类型只能读取,不能写入。因为不知道这个容器放什么类型的数据,所以只能读取不能添加。

  • 最好不要在返回类型中使用通配符,因为确切知道方法返回的类型更安全。

java 复制代码
public static void main(String[] args) {
    List<String> name = new ArrayList<String>();
    List<Integer> age = new ArrayList<Integer>();
    List<Number> number = new ArrayList<Number>();

    name.add("icon");
    age.add(18);
    number.add(314);

    getData(name);   // icon
    getData(age);    // 18
    getData(number); // 314
}

// List<?>,在逻辑上是List<String>,List<Integer>等所有List<具体类型实参>的父类。
public static void getData(List<?> data) {
    System.out.println("data :" + data.get(0));
}

2.4. 上下边界限定

  • 上界限定通配符:<? extends E>,表示只接受E类型及其子类型。
  • 下界限定通配符:<? super E>, 表示只接受E类型及其父类型。
java 复制代码
public static void main(String[] args) {
    List<String> name = new ArrayList<String>();
    List<Integer> age = new ArrayList<Integer>();
    List<Number> number = new ArrayList<Number>();

    name.add("icon");
    age.add(18);
    number.add(314);

    getUperNumber(name);   // 编译时报错,String类型不是Number的子类
    getUperNumber(age);    // 18
    getUperNumber(number); // 314
}

public static void getData(List<?> data) {
    System.out.println("data :" + data.get(0));
}

// List<? extends Number>,在逻辑上是List<Number>,List<Integer>等类的父类。
public static void getUperNumber(List<? extends Number> data) {
    System.out.println("data :" + data.get(0));
}

信息来源于:【每次一个技术点】泛型之类型擦除_哔哩哔哩_bilibili

讲解的非常好,up主的基本功非常好,一些细节上的问题,和语言设计时出现的缺点都讲的透透的!

相关推荐
许彰午4 分钟前
39_Java单元测试JUnit入门
java·junit·单元测试
shushangyun_5 分钟前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
JAVA9659 分钟前
JAVA面试-JVM篇 03-JVM运行时数据区哪些是线程私有的哪些是共享的
java·jvm·面试
xingpanvip9 分钟前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
于先生吖14 分钟前
教育类Java实战项目:在线错题整理平台分层架构设计与接口源码解析
java·开发语言
慧一居士16 分钟前
Feign的GET请求如何传递对象参数?
java·spring cloud
桥田智能23 分钟前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
开发小能手-roy1 小时前
StringBuilder vs StringBuffer:2024年还需要线程安全字符串吗?
开发语言·python·安全
开发小能手-roy1 小时前
Java集合框架选型指南:从ArrayList到ConcurrentSkipListMap
java·开发语言
凡人叶枫1 小时前
Effective C++ 条款41:了解隐式接口和编译期多态
java·开发语言·c++·effective c++