2016-05-26 10 views
1

Ich habe zwei Klassen, sagen wir A und B; beide geben CompletionStage zurück. B-Code
Klasse:
Warum verursacht dieser CompletionStage-Code einen Kompilierungsfehler?

class B { 
    public CompletionStage<Optional<Map<String, Object>>> m1(SampleObject1 obj) { 
     return CompletableFuture.supplyAsync(() -> dosomething(obj)) 
      .thenApplyAsync(results -> 
       Optional.ofNullable((results.length == 1) ? results : null) 
      ); 
    } 
} 

Klasse A Code:

class A { 
    public CompletionStage<Optional<SampleObject2>> m2(Optional<DynamicForm> dynamicForm) { 
     CompletionStage<DynamicForm> promiseOfFormData = CompletableFuture.supplyAsync(() -> dynamicForm.get()); 

     CompletionStage<Optional<Map<String, Object>>> c = promiseOfFormData.thenApplyAsync(
      data -> b.m1(new SampleObject1(data.get("key1"), data.get("key2"))) 
     ); 
     return something.....; 
    } 
} 

aber es wirft zur Laufzeit folgende Fehlermeldung:

inference variable U has incompatible bounds 
    equality constraints: java.util.Optional<java.util.Map<java.lang.String,java.lang.Object>> 
    lower bounds: java.util.concurrent.CompletionStage<java.util.Optional<java.util.Map<java.lang.String,java.lang.Object>>> 

Was bin ich hier falsch machen?

+1

Sie versuchen, eine 'CompleableFuture >>' zurückzugeben, bei der der deklarierte Rückgabetyp 'CompletionStage >' lautet. Das funktioniert natürlich nicht. – Holger

+1

@Abhinab, ich habe mir die Freiheit genommen, deine letzte Bearbeitung rückgängig zu machen, da die akzeptierte Antwort besser mit der ursprünglichen Frage übereinstimmt als deine vorläufige Lösung. Ich hoffe es geht dir gut. –

+0

@Didier, sicher kein Problem –

Antwort

2

Sie haben ein Problem mit Ihrem Rückgabetyp:

b.m1(new SampleObject1(data.get("key1"), data.get("key2"))) 

ein CompletionStage<Optional<Map<String, Object>>> wie aus der Methodensignatur in B Rückkehr, so

data -> b.m1(new SampleObject1(data.get("key1"), data.get("key2"))) 

ist vom Typ Function<DynamicForm,CompletionStage<Optional<Map<String, Object>>>> und die folgenden

promiseOfFormData.thenApplyAsync(
    data -> b.m1(new SampleObject1(data.get("key1"), data.get("key2"))) 
); 

ist somit vom Typ CompletionStage<CompletionStage<Optional<Map<String, Object>>>> ist nicht kompatibel mit dem Zieltyp CompletionStage<Optional<Map<String, Object>>>. Der Fehler liegt in der Berechnung der Grenzen des Zieltyps.

Was sollten Sie tun, stattdessen wahrscheinlich CompletionStage#thenComposeAsync wird verwendet werden, die für Funktionen ausgelegt ist, die auch ein CompletionStage zurück:

CompletionStage<Optional<Map<String, Object>>> c = promiseOfFormData.thenComposeAsync(
    data -> b.m1(new SampleObject1(data.get("key1"), data.get("key2"))) 
); 

Alternativ können Sie m1 umschreiben zu keinem CompletionStage zu schaffen, sondern nur um die Berechnung durchzuführen, und dann verwenden Sie es in einem thenApplyAsync Anruf, wie Sie zuvor taten.

+0

bearbeitet Klasse A nach Ihrem Vorschlag. Bitte schauen Sie sich den Code der Klasse A an. Aber Fehler existiert immer noch. Können Sie mir bitte helfen –

+1

@AbhinabKanrar Ich habe eine vorgeschlagene Lösung in meiner Antwort, basierend auf dem ursprünglichen Code hinzugefügt. Sie sollten Ihre Fragen jedoch nicht mit Folgefragen oder mit Antworten ändern. Sie sollten auch auf Ihre Codeformatierung achten, da die Leute schlecht formatierte Fragen nicht lesen werden (ich hatte die Formatierung bereits bearbeitet, bevor Sie sie geändert haben). –

+0

Vielen Dank. mit thenComposeAsync. arbeite jetzt :) –

Verwandte Themen