2016-04-30 11 views
0

Ich habe eine Klasse, die eine Schnittstelle Objekt im Konstruktor hat:Java generic Lambda Anruf

private Operator(/* ..., */ final Operation<?> operation) { 
    //... 
} 

Betrieb ist eine generische Schnittstelle mit einer Methode:

@SuppressWarnings("unchecked") 
public T applyOperation(T... arguments); 

ich ein Objekt jetzt erstellen der Klasse Operator so:

public static final Operator POSTFIX_INCREASE = new Operator(/* ...,*/ new Operation<Integer>() { 

    @Override 
    public Integer applyOperation(Integer... arguments) { 
     return arguments[0]++; 
    } 
}); 

Aber ich möchte dies mit einem Lambda-Ausdruck. Dies ist, was Eclipse selbst reconmends (Und es sieht so weit gut):

public static final Operator POSTFIX_INCREASE = new Operator("++", 0, 1, true, arguments -> arguments[0]++); 

Das einzige Problem ... Es funktioniert nicht: D Natürlich weiß ich, ich brauche Typinformationen zur Verfügung zu stellen: Ich brauche eine ganze Zahl Implementierung der Bedienerschnittstelle. In der anonymen Klasse kann ich einfach den Standardweg angeben, aber in einem Lambda-Ausdruck ist dies nicht möglich. Gibt es eine Möglichkeit, einen generischen Lambda-Ausdruck zu schreiben, oder unterstützen sie das nicht? (was keine große Überraschung sein würde, da Generika in Java nicht sehr flexibel ist) wird mit

+0

einen expliziten Typ Geben Sie für 'arguments' –

+0

Wie meinen Sie das? Die Variablenargumente in der Schnittstelle müssen generisch sein. Oder meinst du den Aufruf von Argumenten im Lambda-Ausdruck? Denn dann möchte ich wissen, wie man explizite Argumente liefert – Cydhra

+3

Java weiß nicht, was der Typ von 'Argumente' sein soll. Es kann nicht von irgendwo her schließen. Verwenden Sie '(Integer ... Argumente) -> ...' zum Beispiel. –

Antwort

0

Da Ihrem Parametertyp eine Wildcard

final Operation<?> operation 

und die Instanz Schöpfung Ausdruck hat keine zusätzliche Typinformationen

public static final Operator POSTFIX_INCREASE = new Operator("++", 0, 1, true, arguments -> arguments[0]++); 

Der Compiler hat keine Möglichkeit zu entscheiden, welcher Typ für den Parameter Ihres Lambda-Ausdrucks abgeleitet werden soll.

Sie müssen hier explizit sein. Entweder Ihr Konstruktor ändern Parametertyp

private Sample(/* ..., */ final Operation<Integer> operation) { 

oder geben Sie den Lambda-Parameter-Typ

new Operator("++", 0, 1, true, (Integer... arguments) -> arguments[0]++)