Java中为Think(Thunk)实现map函数报错,如何指定泛型?
问题分析与解决
错误原因很明确:你调用Think.of()时传入的是一个Supplier<R>类型的Lambda表达式,但现有的of方法只接受T类型的实例参数。编译器试图将这个Lambda当作R类型的实例处理,可R并非函数式接口,因此触发类型不匹配错误。
解决方法一:新增Supplier参数的of方法重载
给Think类添加一个接受Supplier<T>的静态of方法,让它支持直接传入供应商逻辑,这样map方法里的调用就能匹配正确的类型:
public class Think<T> implements Supplier<T> { private Supplier<T> supplier; public Think(Supplier<T> expression) { this.supplier = () -> evaluate(expression); } // 原有接受值的of方法 public static <T> Think<T> of(T value) { return new Think<>(() -> value); } // 新增接受Supplier的of方法重载 public static <T> Think<T> of(Supplier<T> supplier) { return new Think<>(supplier); } private synchronized T evaluate(Supplier<T> expression) { this.supplier = expression; return this.supplier.get(); } @Override public T get() { return this.supplier.get(); } public <R> Think<R> map(Function<? super T, ? extends R> mapper) { return Think.of(() -> mapper.apply(get())); } }
解决方法二:直接实例化Think<R>
如果不想新增方法,直接在map方法里调用Think的构造函数即可,跳过of方法的中转:
public <R> Think<R> map(Function<? super T, ? extends R> mapper) { return new Think<>(() -> mapper.apply(get())); }
两种方案都能解决类型不匹配问题,方案一更贴合现有代码的设计风格,方案二则更简洁直接。
内容的提问来源于stack exchange,提问作者caduceus
相关产品推荐
相关产品推荐

