2017-08-26 19 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のWebサイトのメソッドチュートリアル)のメソッド参照セクションを振り返り、「特定のタイプの任意のオブジェクトのインスタンスメソッドへの参照」カテゴリにあります。これはContainingType::methodNameの形式にする必要があります。鉱山はこの形式になっているので、私はそれを潜在的な原因として排除しました。

+1

'this :: term'を試したところ、うまくいきました。それでも、なぜ私の最初の試みがしなかったのか不思議です。 –

答えて

0

このケースではthis::termが働いていると思って、私は間違いを認識しました。私のメソッド参照は、暗黙のオブジェクトが恣意的ではないので、タイプIntSequenceの任意のオブジェクトのインスタンスメソッドを参照しません。 fullSequencegetTermは同じインタフェースで宣言されたインスタンスメソッドであるため、fullSequenceのメソッド参照は、IntSequenceの配列またはコレクションに対して作用しないとみなされます。これは現在のインスタンスを参照します。