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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 23:12:26