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

泛型类型的推断确定

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

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

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

  1. 方法返回值确定
java 复制代码
   @Override
    public Function<List<Integer>, List<Integer>> finisher() {
        return Function.identity();
    }

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

  1. 参数类型确定
java 复制代码
    <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的泛型。 总之 静态泛型方法的泛型类型主要有以下两种途径确定:

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

调用泛型静态方法时指定

java 复制代码
public class GenericMethodInference {
    // 定义泛型方法,返回类型为泛型 T
    public static <T> T getDefault() {
        return null;
    }

    public static void main(String[] args) {
        // 手动指定泛型类型为 String
        String str = GenericMethodInference.<String>getDefault();
        // 手动指定泛型类型为 Integer
        Integer num = GenericMethodInference.<Integer>getDefault();
    }
}

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

语法

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

类名.<类型参数>方法名(参数列表);

如果是在类的实例方法里调用本类的泛型方法,也可以省略类名,直接使用:

.<类型参数>方法名(参数列表);

相关推荐
不像程序员的程序媛5 分钟前
maven基础
python·pycharm·maven
益莱储中国42 分钟前
深度解析:RF 实验室从 5G迈向 6G 的过程中保持技术领先与设备升级的路径
开发语言·php
Vex2une1 小时前
Docker Desktop WSL2后端:2026年性能调优与避坑实战指南
windows·docker·desktop·gpu容器·容器开发·virtiofs·buildkit
xiaogai_gai1 小时前
仅查询策略实战:从金蝶云·星空旗舰版定时拉取收料通知单
大数据·数据库·python
benchmark_cc2 小时前
Python 量化系统如何设计统一的数据访问接口:从策略解耦到数据层架构
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
const_qiu2 小时前
第四章 00:开篇 —— 从「会聊天」到「记得住、会干活、能协作」
java·开发语言·人工智能·python
Wang's Blog2 小时前
Java 项目实战: 交友项目 - 个人资料管理的更新接口实现与坑
java·开发语言·交友
CoderYanger2 小时前
Java EE 进阶:4.Spring Web MVC 入门(第一弹)
java·开发语言·前端·spring·面试·java-ee·mvc
钱栈up2 小时前
搜狗中文模式打不出顿号?在 Windows 沙箱里探测输入法配置的踩坑实录
windows
估值探索者3 小时前
【Python量化选股流水线 #04】选股器好不好用?「昨日候选→今日表现」回看验收
开发语言·python·股票数据·股票数据api接口