三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Java泛型核心知识点详解

Java泛型核心知识点详解

本文详细讲解Java泛型核心知识点,涵盖泛型作用、泛型类、泛型方法、泛型接口、通配符、上下限、优缺点。

一、泛型概述

泛型就是参数化类型,把数据类型当作参数传递。
作用:

  1. 在编译阶段检查类型,避免运行时类型转换异常
  2. 避免强制类型转换,代码更简洁
  3. 通用通用组件,提高代码复用性

二、泛型的好处

无泛型

Listlist=newArrayList();list.add("Java");list.add(100);// 取出必须强转Strings=(String)list.get(0);

有泛型

List<String>list=newArrayList<>();list.add("Java");// list.add(100); 编译报错,类型安全Strings=list.get(0);// 无需强转

三、泛型类

把泛型定义在类上,类中方法可直接使用泛型。

1. 定义泛型类

// T:类型参数,可以是任意标识publicclassBox<T>{privateTdata;publicTgetData(){returndata;}publicvoidsetData(Tdata){this.data=data;}}

2. 使用泛型类

publicclassTest{publicstaticvoidmain(String[]args){Box<String>box=newBox<>();box.setData("泛型测试");Strings=box.getData();}}

四、泛型方法

把泛型定义在方法上,方法独立使用泛型。

publicclassGenericMethod{// 泛型方法public<T>Tshow(Tt){System.out.println(t);returnt;}}

使用:

show("Java");show(100);show(3.14);

五、泛型接口

把泛型定义在接口上。

1. 定义泛型接口

publicinterfaceMyInterface<T>{Ttest();}

2. 实现方式1:指定具体类型

publicclassTestImplimplementsMyInterface<String>{@OverridepublicStringtest(){return"指定类型";}}

3. 实现方式2:保留泛型

publicclassTestImpl2<T>implementsMyInterface<T>{@OverridepublicTtest(){returnnull;}}

六、泛型通配符

1. 通配符:?

表示任意类型

publicvoidshow(List<?>list){// 可以接收任意泛型List}

2. 上限通配符:? extends T

只允许 T 及 T 的子类

// 接收Number或Number子类publicvoidshow(List<?extendsNumber>list){}

3. 下限通配符:? super T

只允许 T 及 T 的父类

// 接收Integer或Integer父类publicvoidshow(List<?superInteger>list){}

七、泛型常见命名规范

  • T:Type(类型)
  • E:Element(集合元素)
  • K:Key(键)
  • V:Value(值)
  • N:Number(数值)

八、泛型注意事项

  1. 泛型在编译时有效,运行时会被擦除
  2. 泛型不能使用基本类型,必须使用包装类
  3. 静态方法不能使用类泛型,必须自己定义
  4. 泛型数组不能直接创建:new T[10]

九、泛型使用场景

  1. 集合类:List<T>、Map<K,V>
  2. 通用工具类、通用结果返回类
← 返回列表