我创建了一些接口作为包的一部分来帮助研究整数序列,当我尝试编译它时:
package sequences;
import java.util.stream.IntStream;
@FunctionalInterface
public interface IntSequence extends IntegerSequence
{
int term(int n);
default int[] termsInRange(int start, int stop)
{
int[] result = new int[stop - start];
for (int i = 0; i < stop - start; i++)
{
result[i] = term(start + i);
}
return result;
}
/*
* Method "length" is defined in parent interface like so:
* default int length() { return Integer.MAX_VALUE; }
*/
default IntStream fullSequence(int start)
{
IntStream intermediate = start == 0 ? IntStream.range(start, length())
: IntStream.rangeClosed(start, length());
return intermediate.map(IntSequence::term);
}
}
我被抛出了这个:
PS C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\src> javac -d ..\cls -Xdiags:verbose sequences\IntSequence.java
sequences\IntSequence.java:24: error: method map in interface IntStream cannot be applied to given types;
return intermediate.map(IntSequence::term);
^
required: IntUnaryOperator
found: IntSequence::term
reason: argument mismatch; invalid method reference
cannot find symbol
symbol: method term(int)
location: interface IntSequence
1 error
考虑到我的方法term(int)
显然是IntUnaryOperator
,并且用e -> term(e)
替换方法引用会导致编译成功,我不知道为什么我会得到这个错误。
为了确保,我回顾了Java教程中的方法引用部分(Oracle网站上的那个),我的类别是#34;引用任意对象的实例方法特定类型的#34;,其格式应为ContainingType::methodName
。我的格式是这样的,所以我把它当作潜在的原因消除了。
答案 0 :(得分:0)
经过一番思考,在发现this::term
在这种情况下工作后,我意识到自己的错误。我的方法引用不引用类型IntSequence
的任意对象的实例方法,因为隐含的对象不是任意的。由于fullSequence
和getTerm
是在同一接口中声明的实例方法,因此编译器假设fullSequence
中的方法引用不对{的数组或集合起作用是合乎逻辑的。 {1}} s指的是当前实例。