Ich versuche, die generische Typ Informationen aus dem Rückgabetyp eines Lambda-Ausdruck über einige höherrangige Funktionen in Java 8 zu erhalten. Ich habe meinen tatsächlichen Code zu diesem Test vereinfacht Fall. Das Problem ist nicht, was ich erwarte den Code genau zu tun, aber ich erwarte nicht die generische Art (en) R
als java.lang.String
abgeleitet werden und durch die Funktionsaufrufe durchgeführt.Java 8 - Generieren Rückgabetyp mit Lambdas
import java.util.function.Function;
public class AdamTest {
public final static void main(final String args[]) {
final AdamTest adamTest = new AdamTest();
final String s = adamTest.thing2(7).apply(i -> i.toString());
System.out.println(s);
}
private <R> R fn1(final Function<Integer, R> op) {
return op.apply(10);
}
private <R> Function<Function<Integer, R>, R> thing2(final Integer val) {
return fn1(i -> new Function<Function<Integer, R>, R>() {
@Override
public R apply(Function<Integer, R> op) {
return op.apply(val * i);
}
}
);
}
}
Im Moment kompiliert dieser Code nicht wegen dieser Zeile final String s = adamTest.thing2(7).apply(i -> i.toString());
. Ich denke, dass ich mit meinen Typgrenzen etwas Unverständliches habe, da der Compiler nicht in der Lage ist, den Rückgabetyp von thing2(7).apply
abzuleiten und Object
statt String
, auf den ich gehofft hatte, zu erhalten.
Wie erhalte ich die generische Typ Grenzen richtig, so dass der korrekte Rückgabetyp heißt java.lang.String
wird durch den Compiler zu entnehmen?
Können Sie den Fehler hinzufügen, den Sie bekommen? –
Der Compiler "bewertet" den Ausdruck von links nach rechts; Das Problem tritt bei 'adamTest.thing2 (7)' auf. Der Compiler betrachtet die '.apply' nicht, um den Typ herauszufinden, und ohne das ist es nicht möglich. –
Was versuchst du genau zu machen? Das ist völlig unklar. – fge