问题描述
我正在尝试使用 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)””
如果我无论如何都要编译它,javac:error: <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
之间的各种不匹配的错误在那里也很常见。
所以我的问题是:
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"
}