如何实现支持类型推断、同类型输入输出的通用函数式接口?
实现支持自动类型推断的同类型输入输出函数式接口
首先,先明确你的核心需求:一个函数式接口,既要求输入和返回值类型一致,又能在调用其方法时让Java自动推断类型,而不需要提前指定接口的泛型类型。
为什么你原来的实现无法支持自动推断?
你写的MonoFunction<T>是接口级泛型,这意味着每个MonoFunction实例只能绑定到一个具体的类型T。当你省略泛型声明写成MonoFunction foo时,Java会默认把T推断为Object,这时候调用apply返回的是Object类型,无法直接赋值给A或B类型的变量——这就是你遇到必须手动指定类型的原因。
解决方案:将泛型定义在方法级别
要实现同一个接口实例处理不同类型的输入(且保证输入输出类型一致),只需要把泛型从接口层面移到方法层面即可:
@FunctionalInterface public interface MonoFunction { <T> T apply(T arg); }
这样修改后,apply方法本身是泛型方法,每次调用它时,Java会根据传入的参数自动推断出T的具体类型,同时保证输入和返回值都是这个类型。
验证你的伪代码场景
用修改后的接口,你的示例代码可以正常编译运行:
class A { int a; } class B { int b; } public static void main(String[] args) { A a; B b; MonoFunction foo = (obj) -> { System.out.println(obj); return obj; }; a = foo.apply(new A()); // 自动推断T为A,返回A类型 b = foo.apply(new B()); // 自动推断T为B,返回B类型 }
额外说明
- 这个方案完全满足你的两个要求:输入和返回类型一致,且调用时自动推断类型。
- 如果需要对
T添加额外约束(比如必须是某个类的子类),可以修改泛型声明为<T extends SomeClass>,灵活度很高。
内容的提问来源于stack exchange,提问作者Hashken
相关产品推荐
相关产品推荐

