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

将维基百科Java Monad示例改写为非Lambda表达式(Java1.7)报错求助

Java 1.7兼容Monad实现的错误修正

你的代码主要存在以下几个问题,对应错误提示逐一解决:

1. Java 1.7无java.util.function.Function接口

这个接口是Java 8才引入的,Java 1.7需要自己定义等价的函数式接口:

interface Function<T, R> {
    R apply(T t);
}

2. MonadFunction未声明泛型参数且类型处理错误

你直接使用T和U但没有在类级别声明泛型,Java会将它们视为未定义的类;另外Monad是接口不能直接实例化,且泛型类型T无法直接执行+1这类数值运算。针对原代码的Integer运算逻辑,我们可以实现两个具体的Function类:

对应原Lambda v -> new Maybe<>(v + 1)

class AddOneFunction implements Function<Integer, Monad<Integer>> {
    @Override
    public Monad<Integer> apply(Integer val) {
        return new Maybe<Integer>(val + 1);
    }
}

对应原Lambda v -> new Maybe<>(v * 2)

class MultiplyByTwoFunction implements Function<Integer, Monad<Integer>> {
    @Override
    public Monad<Integer> apply(Integer val) {
        return new Maybe<Integer>(val * 2);
    }
}

3. 移除Java 8专属语法

Java 1.7不支持菱形运算符<>,实例化Maybe时需要显式指定类型参数,比如new Maybe<Integer>(5)而非new Maybe<>(5)。

4. 修正语法细节

原代码中x.bind(new MonadFunction())缺少分号,且未补充第二个bind调用。


完整修正后的代码

// 自定义Java 1.7兼容的Function接口
interface Function<T, R> {
    R apply(T t);
}

interface Monad<T> {
    <U> Monad<U> bind(Function<T, Monad<U>> f);
}

class Maybe<T> implements Monad<T> {

    private final T val;

    public Maybe(T val) {
        this.val = val;
    }

    public T getVal() {
        return val;
    }

    @Override
    public <U> Monad<U> bind(Function<T, Monad<U>> f) {
        if (val == null)
            return new Maybe<U>(null);
        return f.apply(val);
    }
}

// 实现v+1的运算逻辑
class AddOneFunction implements Function<Integer, Monad<Integer>> {
    @Override
    public Monad<Integer> apply(Integer val) {
        return new Maybe<Integer>(val + 1);
    }
}

// 实现v*2的运算逻辑
class MultiplyByTwoFunction implements Function<Integer, Monad<Integer>> {
    @Override
    public Monad<Integer> apply(Integer val) {
        return new Maybe<Integer>(val * 2);
    }
}

public class MonadApp {
    public static void main(String[] args) {
        Maybe<Integer> x = new Maybe<Integer>(5);
 
        Monad<Integer> y = x.bind(new AddOneFunction())
                           .bind(new MultiplyByTwoFunction());
        
        System.out.println( ((Maybe<Integer>)y).getVal() );
    }
}

内容的提问来源于stack exchange,提问作者toowren

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:40:08