Java 引用声明接口时方法引用无效
我正在创建一些接口作为包的一部分,以帮助研究整数序列,当我试图编译此文件时:Java 引用声明接口时方法引用无效,java,java-stream,method-reference,Java,Java Stream,Method Reference,我正在创建一些接口作为包的一部分,以帮助研究整数序列,当我试图编译此文件时: package sequences; import java.util.stream.IntStream; @FunctionalInterface public interface IntSequence extends IntegerSequence { int term(int n); default int[] termsInRange(int start, int stop) {
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);
}
}
考虑到我的方法term(int)
显然是一个IntUnaryOperator
,并且用e->term(e)
替换方法引用会导致编译成功,我不知道为什么会出现此错误
为了确保这一点,我回顾了Java教程(Oracle网站上的教程)中的方法引用部分,我的属于“引用特定类型任意对象的实例方法”类别,其格式应为
ContainingType::methodName
。我的是这种格式,所以我已经排除了这一潜在原因。经过思考,发现这个::术语在这种情况下起作用后,我意识到我的错误。My method reference不引用类型为IntSequence
的任意对象的实例方法,因为隐含对象不是任意的。由于fullSequence
和getTerm
是在同一接口中声明的实例方法,编译器假定fullSequence
中的方法引用不作用于引用当前实例的IntSequence的数组或集合是合乎逻辑的。我刚刚尝试了this::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