Java方法引用Demo::b传入Function<?,Boolean>报错原因咨询
为什么直接传递方法引用
Demo::b给testFunction会报错? 先看问题中的代码:
public class Demo { private static Boolean b(String a) { return false; } public static void testFunction(Function<?, Boolean> whatever) { } public void test() { Function<String, Boolean> noUse = Demo::b; testFunction(noUse); testFunction((Function<String, Boolean>) Demo::b); // why it's wrong testFunction(Demo::b); } }
核心原因:Java类型推断的局限性
当方法参数是通配符泛型Function<?, Boolean>时,编译器无法自动推断出方法引用Demo::b对应的具体泛型类型:
- 把
Demo::b赋值给Function<String, Boolean> noUse时,编译器明确知道目标类型是Function<String, Boolean>,能直接匹配方法b的String入参、Boolean返回值的签名。 - 强转
(Function<String, Boolean>) Demo::b时,你手动指定了目标类型,编译器能确认匹配关系。 - 但直接调用
testFunction(Demo::b)时,Function<?, Boolean>中的通配符?代表“任意类型”,编译器无法确定这个?应该对应String还是其他类型——方法引用本身没有携带足够的类型信息,让编译器反向锁定到String这个具体入参类型。
简单来说:通配符作为目标类型时,Java的类型推断无法完成“从方法引用反推泛型参数”的逻辑,必须通过显式赋值或强转来明确类型上下文。
内容的提问来源于stack exchange,提问作者王海航
相关产品推荐
相关产品推荐

