dba*_*tor 6 java generics monads functional-programming java-8
我试图在本文后面的Java 8中实现Monad接口但是我有以下编译错误
找到2个错误:
File:FunctorsMonads.java [line:36]
错误:FOptional不是抽象的,并且不会覆盖Monad中的抽象方法flatMap(java.util.function.Function>)
File:FunctorsMonads.java [line:50]
错误:名称冲突:FOptional中的flatMap(java.util.function.Function>)和Monad中的flatMap(java.util.function.Function)具有相同的擦除,但都没有覆盖其他
该Functor接口工作得很好.任何帮助深表感谢.
这是代码:
import java.util.function.Function;
public class FunctorsMonads {
  public static void main(String[] args) {
    System.out.println(tryParse("47"));
    System.out.println(tryParse("a"));
    FOptional<String> str = FOptional.of("47");
    System.out.println(str);
    FOptional<FOptional<Integer>> num = str.map(FunctorsMonads::tryParse);
    System.out.println(num);
    FOptional<Integer> num2 = str.flatMap(FunctorsMonads::tryParse);
    System.out.println(num2);
  }
  static FOptional<Integer> tryParse(String s){
    try {
      final int i = Integer.parseInt(s);
      return FOptional.of(i);
    } catch (NumberFormatException e) {
      return FOptional.empty();
    }
  }
}
interface Functor<T, F extends Functor<?, ?>> {
  <R> F map(Function<T, R> f);
}
interface Monad<T, M extends Monad<?, ?>> extends Functor<T, M> {
  M flatMap(Function<T, M> f);
}
//class FOptional<T> implements Functor<T, FOptional<?>>
class FOptional<T> implements Monad<T, FOptional<?>> {
  private final T valueOrNull;
  private FOptional(T valueOrNull) {
    this.valueOrNull = valueOrNull;
  }
  public <R> FOptional<R> map(Function<T, R> f) {
    if (valueOrNull == null)
      return empty();
    else
      return of(f.apply(valueOrNull));
  }
  public <R> FOptional<R> flatMap(Function<T, FOptional<R>> f) {
    if (valueOrNull == null)
      return empty();
    else
      return f.apply(valueOrNull);
  }
  public static <T> FOptional<T> of(T a) {
    return new FOptional<T>(a);
  }
  public static <T> FOptional<T> empty() {
    return new FOptional<T>(null);
  }
  @Override
  public String toString() {
    return getClass().getName() + "<" + valueOrNull + ">";
  }
}
Run Code Online (Sandbox Code Playgroud)
编辑:
 
我在main方法中添加了以下几行作为实现正确性的试金石:
FOptional<Integer> num2 = str.flatMap(FunctorsMonads::tryParse);
 System.out.println(num2);