2017-08-26 87 views
0

我創建一些接口作爲一個包的一部分在整數序列的研究,以幫助,並且當我試圖編譯時此:無效方法參考引用聲明接口

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網站上的教程)中的方法參考部分,並且我的類別爲「引用特定類型任意對象的實例方法」,這應該是在格式ContainingType::methodName。礦井採用這種格式,所以我將其作爲潛在的原因予以消除。

+1

我只是想'這:: term'和它的工作。不過,我很好奇爲什麼我的第一次嘗試沒有。 –

回答

0

經過一番思考,並發現,this::term在這種情況下的工作之後,我意識到自己的錯誤。我的方法的參考不引用IntSequence類型的任意對象的實例方法中,作爲隱含對象不是任意的。如fullSequencegetTerm在相同的接口中聲明的實例方法,該編譯器將假設在fullSequence的方法參考不經的IntSequence秒的陣列或集合作用是指當前實例是合乎邏輯的。