引用声明接口

时间:2017-08-26 00:22:10

标签: 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)
    {
        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。我的格式是这样的,所以我把它当作潜在的原因消除了。

1 个答案:

答案 0 :(得分:0)

经过一番思考,在发现this::term在这种情况下工作后,我意识到自己的错误。我的方法引用不引用类型IntSequence的任意对象的实例方法,因为隐含的对象不是任意的。由于fullSequencegetTerm是在同一接口中声明的实例方法,因此编译器假设fullSequence中的方法引用不对{的数组或集合起作用是合乎逻辑的。 {1}} s指的是当前实例。