将维基百科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
相关产品推荐
相关产品推荐

