私は、整数のシーケンスの研究を支援するためにパッケージの一部として、いくつかのインタフェースを作成していて、私はこれをコンパイルしようとしたときに宣言参照する場合:無効なメソッドリファレンスインタフェース
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
の形式にする必要があります。鉱山はこの形式になっているので、私はそれを潜在的な原因として排除しました。
'this :: term'を試したところ、うまくいきました。それでも、なぜ私の最初の試みがしなかったのか不思議です。 –