为何List<String>无法匹配List<Object>参数,调用Object重载方法?
为什么
List<String>不会匹配test(List<Object>)方法? 这是Java泛型的不变性和方法重载解析规则共同导致的结果,具体原因如下:
1. 泛型是不变的,而非协变
虽然String是Object的子类,但List<String>并不是List<Object>的子类。Java泛型默认是不变的——也就是说,对于任意两个不同的类型A和B,List<A>既不是List<B>的子类,也不是它的父类。
这意味着你的listOfString(静态类型为List<String>)无法直接适配List<Object>类型的参数,编译器会判定这两个类型不兼容。
2. 方法重载的编译期匹配规则
Java的方法重载是在编译阶段确定调用目标的,依据的是参数的静态类型(即变量声明时的类型,而非运行时实际类型)。
对于test(listOfString):
- 编译器首先尝试匹配最精确的方法:
test(List<Object>),但List<String>与List<Object>类型不匹配,无法通过编译检查。 - 接着编译器会寻找次一级匹配的方法:
test(Object),由于所有Java对象都继承自Object,List<String>自然属于Object的子类范畴,因此这个方法会被选中。
如何让List<String>匹配List参数的方法?
如果你想让任意List类型都匹配到List参数的重载方法,可以把方法参数改为带通配符的泛型:
// 写法1:明确声明通配符上限 public static String test(List<? extends Object> a){ return "List"+ a; } // 写法2:更简洁的通用List匹配 public static String test(List<?> a){ return "List"+ a; }
修改后,listOfString和listOfObject都会调用这个方法,输出结果将符合你的预期。
内容的提问来源于stack exchange,提问作者Hemant Chaudhary
相关产品推荐
相关产品推荐

