Java使用var关键字与无参泛型方法时的类型推断方式
Java中var与无参泛型方法的类型推断
先看定义的无参泛型方法:
private <T> Set<T> create() { return new HashSet<T>(); }
常规场景下,Java编译器会根据返回值的使用上下文推断泛型参数T的类型。比如把方法返回值赋值给明确类型的变量时:
Set<Integer> numbers = create();
编译器会依据左侧变量的类型Set<Integer>,直接推断出create()的泛型参数T为Integer,最终返回HashSet<Integer>实例。
用var声明时的类型推断逻辑
当使用var关键字声明变量时:
var numbers = create();
此时因为var本身不提供明确的类型约束,编译器会触发无约束泛型类型推断,将泛型参数T推断为其最宽泛的合法类型——Object。因此numbers的静态类型会被推断为Set<Object>,实际指向的是HashSet<Object>实例。
这种推断是合法的,后续可以正常调用Set的所有方法,但如果之后尝试将这个集合强制转换为其他泛型类型(比如Set<Integer>),可能会触发运行时的类型转换异常。
内容的提问来源于stack exchange,提问作者eldar.j
相关产品推荐
相关产品推荐

