You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用通配符泛型时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 07:22:07