Java 忽略导入库中的默认接口方法并将它们视为抽象

问题描述

我正在尝试使用 Functional Java 库。

我只是将它包含在 build.gradle

dependencies {
    compile "org.functionaljava:functionaljava:4.8.1"
}

并使用 openjdk-15 进行编译,它可以正常工作......主要是。

我遇到的问题如下:

我需要实现一个 interface (fj.Ord.Definition),它应该是一个函数式接口 - 它有一个default 方法和许多 default 方法。>

这意味着通过 lambda 实现,或者 this

new Ord.DeFinition<MyClass>() {
    @Override
    public F<MyClass,Ordering> compare(MyClass a) {
        return b -> a.myCompare(b);
    }
}

应该没问题。

我得到的是:

Intellij:“类“从定义派生的匿名类”必须声明为抽象或在“定义”中实现抽象方法“比较(A,A)””

如果我无论如何都要编译它,javacerror: <anonymous MyClass$1> is not abstract and does not override abstract method ord()

这当然不仅适用于 ord,也适用于其他 11 个 default 方法

如果我尝试使用 Ord.DeFinition.super 来实现它们

@Override
public F<A,A> prepend(A a1) {
    return Ord.DeFinition.super(a1);
}

我收到错误 'java.lang.Object' is not an inner class

这里要注意的是,在我的项目中从 Intellij 查看时,functionaljava 库源代码充满了这些类型的错误(以及更多)。 Intellij 抱怨类型变量和 Object间的各种不匹配的错误在那里也很常见。

所以我的问题是:

  1. 如何按照库的意图(或至少使用其 Ord.DeFinition 方法)将 default 实现为 lambda?
  2. 尽管该库包含了多少明显的错误,但什么使该库能够被编译?

EDIT1:根据请求,以下是引用的 fj.Ord.Definition 接口的一些块:

/**
 * Tests for ordering between two objects.
 *
 * @version %build.number%
 */
public final class Ord<A> {

  /**
   * Primitives functions of Ord: minimal deFinition and overridable methods.
   */
  public interface DeFinition<A> extends Equal.DeFinition<A>,Semigroup.DeFinition<A> {

    F<A,Ordering> compare(A a);

    default Ordering compare(A a1,A a2) {
      return compare(a1).f(a2);
    }

    // equal:
    @Override
    default boolean equal(A a1,A a2) {
      return compare(a1,a2) == Ordering.EQ;
    }

...

    @Override
    default F<A,A> prepend(A a1) {
      return apply((a2,o) -> o == Ordering.GT ? a1 : a2,compare(a1));
    }

...

    /**
     * Build an ord instance from this deFinition.
     * to be called after some successive {@link #then(F,Ord)} calls.
     */
    default Ord<A> ord() {
      return ordDef(this);
    }
  }

...

EDIT2: 事实证明,在这种情况下,我可以通过使用 fj.Ord#ord(fj.F<A,fj.F<A,fj.Ordering>>)fj.Ord#ord(fj.F2<A,A,fj.Ordering>) 方法创建我的排序来回避这个问题,每个方法都会产生一个 {{1 }}。然而,这并不能回答我提出的问题。

解决方法

您使用了错误的依赖项。 org.functionaljava:functionaljava 进行了改造,可以在 Java 7(和 6 根据项目文档)上工作。您需要改用 org.functionaljava:functionaljava-java8

dependencies {
    implementation "org.functionaljava:functionaljava-java8:4.8.1"
}