当前位置: 首页 > news >正文

泛型方法调用需要显示指定泛型类型的场景

泛型类型的推断确定

一般来说,泛型类型的推断可以由以下几个场景确定:

  1. 变量定义指定类型
List<String> strList = new ArrayList<>();

ArrayList的泛型类型是依据变量的类型确定的。

  1. 方法返回值确定
   @Overridepublic Function<List<Integer>, List<Integer>> finisher() {return Function.identity();}

Function.identity();本身是个泛型方法,但是没有明确指定泛型类型,但是方法返回值有类型,所有这里的泛型类型就被编译器推断为<List, List>。

  1. 参数类型确定
    <R, A> R collect(Collector<? super T, A, R> collector);public interface Collector<T, A, R> public static <T>Collector<T, ?, List<T>> toList() {return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add,(left, right) -> { left.addAll(right); return left; },CH_ID);}

Stream的泛型类型为T,collect方法需要一个Collector类型的参数,Collector类型有3个泛型,此时能确定第一个泛型类型为Stream的泛型类型,而这里又调用了Collectors.toList()方法,用于获取Collector,但是toList方法是没有参数,所以无法从参数推导返回值的泛型类型,那第二个确定返回值泛型类型的方式就是通过调用者确定的泛型类型来推断泛型类型。

这里的调用者是Stream的collect 而Stream的泛型类型可以推断出,进而又能确定
<R, A> R collect(Collector<? super T, A, R> collector); 第一个泛型类型,能确定第一个泛型类型,那toList方法返回值Collector的第一个泛型就是推断出来的泛型,进而确定 List的泛型。 总之 静态泛型方法的泛型类型主要有以下两种途径确定:

泛型方法返回值未赋值给具体类型的变量。  --> 没有返回值可确定
泛型方法参数列表为空,缺乏类型推断依据。  --> 没有参数可确定

调用泛型静态方法时指定

public class GenericMethodInference {// 定义泛型方法,返回类型为泛型 Tpublic static <T> T getDefault() {return null;}public static void main(String[] args) {// 手动指定泛型类型为 StringString str = GenericMethodInference.<String>getDefault();// 手动指定泛型类型为 IntegerInteger num = GenericMethodInference.<Integer>getDefault();}
}

getDefault方法没有参数,如果直接GenericMethodInference.getDefault调用,编译器无法通过参数以及接收的返回值类型确定泛型,所以此时就是Object。

语法

在调用泛型方法时,在方法名前使用 <类型参数> 来显式指定泛型类型,语法格式为:
类名.<类型参数>方法名(参数列表);

如果是在类的实例方法里调用本类的泛型方法,也可以省略类名,直接使用:
.<类型参数>方法名(参数列表);

http://www.lqws.cn/news/454465.html

相关文章:

  • 【JUC面试篇】Java并发编程高频八股——线程池
  • 5G 浪潮:发展全景、困境突围与未来航向
  • Fiddler抓包工具使用技巧:如何结合Charles和Wireshark提升开发调试效率
  • conda(Anaconda/Miniconda)常用命令
  • 头部黄金珠宝品牌扬帆狮城,百胜双中台一体化方案护航全球化运营
  • Linux下nginx访问路径页面
  • 【MySQL篇10】:四种分库分表详解
  • 云蝠智能大模型呼叫系统:为企业提供专业的智能客户联络
  • 第3讲、LangChain性能优化:上下文缓存与流式响应实战指南
  • 通过Radius认证服务器实现飞塔/华为防火墙二次认证:原理、实践与安全价值解析
  • django serializer __all__中 额外添加外键里的某一个属性
  • King’s LIMS 系统引领汽车检测实验室数字化转型
  • Unity3d中使用Mirror进行自定义消息通信
  • 解锁决策树:数据挖掘的智慧引擎
  • YOLO系列模型基础与实战(YOLO系列发展线)
  • YOLOv11改进 | RCS-OSA与C3k2融合架构技术详解
  • 容器技术技术入门与Docker环境部署
  • 在 CentOS 7.9 中 Node 18.20.2 安装指南
  • HTTP 请求方法与状态码
  • MySQL慢SQL优化全攻略:从诊断到调优
  • day30 导包
  • html和css实现文本打断换行、自动换行
  • postgresql DDL脚本
  • 电影感户外柔和光线人像街拍摄影后期Lr调色教程,手机滤镜PS+Lightroom预设下载!
  • 高防IP怎么选
  • 开源CMS vs 闭源CMS:二次开发究竟有何不同?
  • 工具:Autosar:DBC转ARXML
  • PLuTo 编译器示例17-20
  • 24. 开发者常用工具:抓包,弱网模拟,元素检查
  • TDengine 与开源可视化编程工具 Node-RED 集成