2017-08-26 2 views
0

ich einige Schnittstellen als Teil eines Pakets in der Studie von Integer-Sequenzen unterstützen erstellen, und wenn ich dies zu kompilieren versucht:Ungültige Methode Referenz, wenn Referenzierung Schnittstelle Deklarieren

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); 
    } 
} 

Ich war dies geworfen:

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 

Anbetracht dessen, dass meine Methode term(int) ist eindeutig ein IntUnaryOperator, und dass die Methode Referenz mit e -> term(e) Ergebnisse bei der erfolgreichen Compilation zu ersetzen, ich bin ratlos, warum ich diesen Fehler bin immer.

Nur um sicher zu gehen, schaute ich zurück auf die Methodenreferenzen im Java-Tutorial (das auf der Oracle-Website) und meins ist in der Kategorie "Referenz auf eine Instanzmethode eines beliebigen Objekts eines bestimmten Typs", Das sollte im Format ContainingType::methodName sein. Meins ist in diesem Format, also habe ich das als mögliche Ursache eliminiert.

+1

Ich habe gerade versucht 'this :: term' und es hat funktioniert. Trotzdem bin ich neugierig, warum mein erster Versuch nicht ging. –

Antwort

0

Nach einigem Nachdenken, und nach der Entdeckung, dass this::term in diesem Fall arbeitete, erkannte ich meinen Fehler. Meine Methodenreferenz verweist nicht auf eine Instanzmethode eines beliebigen Objekts vom Typ IntSequence, da das implizierte Objekt nicht willkürlich ist. Da fullSequence und getTerm Instanzmethoden in derselben Schnittstelle deklariert sind, ist es nur logisch, dass der Compiler eine Methodenreferenz in fullSequence annimmt, die nicht auf ein Array oder eine Sammlung von IntSequences wirkt, die sich auf die aktuelle Instanz beziehen.

Verwandte Themen