Java泛型函数用作查找映射值的声明问题求助
问题分析与解决方案
核心错误:接口签名与目标函数完全不兼容
你定义的aaConverterI接口中,method方法的签名是接收一个Function<T, short[]>参数并返回short[];但你试图放入Map的Helper::convert是接收ab实例、返回short[]的静态方法,两者的参数类型完全不匹配:
- 编译报错提示
convert(Function<T, short[]>)不存在,是因为编译器试图把Helper::convert适配成aaConverterI的method方法,但convert根本不接收Function类型参数。 - 后续定义的
blahFunction是Function<ab, short[]>类型,但它和aaConverterI是不同的函数式接口,类型不兼容,所以依然无法放入Map。
修正方案
你实际需求是存储能处理aa子类对象并返回short[]的转换器,以下两种方案都可以解决问题:
方案1:调整自定义接口的签名
把aaConverterI改成与convert签名匹配的函数式接口:
// 修改后的自定义转换器接口 private interface aaConverterI<T extends aa> { short[] convert(T obj); } // 定义Map时使用通配符兼容aa的所有子类 private static Map<String, aaConverterI<? extends aa>> bar = new HashMap<>(); static { bar.put("blah", Helper::convert); // 类型匹配,编译通过 }
方案2:直接使用Java内置Function接口
无需自定义接口,直接将Map的值类型设为Function<? extends aa, short[]>:
private static Map<String, Function<? extends aa, short[]>> bar = new HashMap<>(); static { bar.put("blah", Helper::convert); // 直接适配,无编译错误 }
额外说明
@FunctionalInterface注解仅适用于只有一个抽象方法的接口,不能用在静态方法上,所以给convert加这个注解完全无效。- 使用通配符
? extends aa可以保证类型安全,同时兼容所有aa的子类实现,满足你通过Map查找不同转换器的需求。
内容的提问来源于stack exchange,提问作者Smrt
相关产品推荐
相关产品推荐

