Java中Collections.emptyList()的泛型返回类型T是如何识别的?
泛型方法emptyList()的类型T推导逻辑
Collections.emptyList()的泛型参数T不是靠方法入参推导,而是依赖调用上下文的目标类型完成编译期推导,分以下几种常见场景:
- 赋值给明确泛型类型的变量时
编译器直接匹配左侧变量的泛型类型作为T的实际类型:
// 自动推导T为String List<String> strList = Collections.emptyList();
- 作为方法返回值返回时
编译器匹配当前方法声明的返回值泛型类型作为T的实际类型:
public List<Integer> getEmptyNumList() { // 自动推导T为Integer return Collections.emptyList(); }
- 作为参数传入其他方法时
编译器匹配目标方法形参的泛型类型作为T的实际类型:
// 目标方法声明 public void handleStringList(List<String> list) { // 逻辑处理 } // 调用时自动推导T为String handleStringList(Collections.emptyList());
如果没有明确的上下文可以推导(比如直接写一行Collections.emptyList();没有赋值、传参或返回操作),编译器会默认将T推导为Object类型。如果需要在推导不明确的场景手动指定T的类型,可以用显式类型参数语法:
// 强制指定T为Long List<Long> longList = Collections.<Long>emptyList();
补充说明:emptyList()返回的EMPTY_LIST是JDK预定义的静态不可变空列表,运行时会进行泛型擦除,不会保留T的类型信息,而且因为列表不可变、永远不会存入元素,所以不会出现类型安全问题。
内容的提问来源于stack exchange,提问作者SGiux
相关产品推荐
相关产品推荐

