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