使用通配符泛型时Function.apply()出现类型不匹配错误的原因
泛型Function调用编译报错原因解析
问题代码
A b1 = new B(); Function<? super B, ? extends A> function = x -> new B(); A apply = function.apply(b1);
编译时报错:Required type capture of ? super B, Provided A
错误原因
核心问题出在泛型通配符的编译期检查逻辑:
Function<? super B, ? extends A>中第一个通配符? super B的含义是:这个Function的输入参数可以是B本身,或者B的任意父类(比如A)。但这里的?是捕获型通配符,编译器无法确定这个Function实际接受的参数类型到底是B、A还是其他父类。- 你声明的变量
b1的编译期类型是A,虽然它实际指向的是B对象,但编译器只看变量的静态类型。此时编译器无法保证:这个Function是否真的接受A类型的参数——比如如果这个Function的实际实现是Function<B, A>,那它只能接受B类型参数,传入A类型变量就会不兼容。 - 因为泛型是编译期检查机制,为了避免运行时类型错误,编译器直接拒绝这种存在不确定性的调用。
解决思路
- 把
b1的静态类型改为B:B b1 = new B();,此时参数类型B属于? super B的覆盖范围,编译通过。 - 如果确实需要用
A类型变量作为参数,可以将Function的参数通配符改为具体的A:Function<A, ? extends A> function = x -> new B();,但这会缩小泛型的适用范围。
内容的提问来源于stack exchange,提问作者Sijo Kurien
相关产品推荐
相关产品推荐

