2016-12-08 2 views
0

je la fonction suivante:Que signifie cette erreur et qu'est-ce qui ne va pas avec mon code?

public CompletableFuture<List<String>> getUsers(final String users) { 
    final CompletionStage<List<String>> cacheFuture = cache.read(users.toString()); 

    return cacheFuture.thenCompose((List<String> userList) -> { 
     if (userList != null) { 
     return CompletableFuture.completedFuture(userList); 
     } 
     return service.getUsers(users).thenApply((List<String> usersFresh) -> { 
      cache.write(users.toString(), usersFresh); 
      return usersFresh; 
     }); 
    }); 
    } 

L'erreur du compilateur que je reçois est:

Bad type de retour dans l'expression lambda: Liste ne peut pas être converti à U

sur la ligne return usersFresh

La signature de méthode pour service.getUsers est:

CompletableFuture<List<String>> getUsers(String users);

Je ne comprends pas ce qui ne va pas avec mon code et pourquoi il ne compilera pas.

+0

ce qui est 'cac he' dans 'cache.read()' et 'service' dans' service.getUsers() '? – nullpointer

+0

Une chose dont je doute est faux ici serait l'utilisation de l'instruction 'return' certainement. Mais vous attendre pour ajouter des détails sur les variables mentionnées ci-dessus ainsi. – nullpointer

Répondre

1

Vous devez convertir CompletionStage-CompletableFuture en utilisant toCompletableFuture, comme:

public CompletableFuture<List<String>> getUsers(final String users) { 
    final CompletionStage<List<String>> cacheFuture = cache.read(users.toString()); 


    return cacheFuture.thenCompose((List<String> userList) -> { 
     if (userList != null) { 
     return CompletableFuture.completedFuture(userList); 
     } 
     return service.getUsers(users).thenApply((List<String> usersFresh) -> { 
      cache.write(users.toString(), usersFresh); 
      return usersFresh; 
     }); 
    }).toCompletableFuture(); //!!! convert `CompletionStage` to `CompletableFuture` in here 
    } 
1

est similaire avec votre méthode veulent revenir ArrayList mais en retour de la méthode List.

Voyons voir:

CompletableFuture<T> implements CompletionStage 

Votre retour d'attente:

public CompletableFuture<List<String>> 

Mais cacheFuture.thenCompose retour CompletionStage

Vous devez changer:

public CompletableFuture<List<String>> to public CompletionStage<List<String>> 
+0

Ou changez le type de 'cacheFuture' en' CompletableFuture', bien qu'il soit préférable de coder par rapport aux interfaces comme vous l'avez proposé. D'une certaine manière, la plupart des exemples que je vois utilisent l'implémentation à la place de l'interface. –

+0

oui c'est optionnel dépend de situations spécifiques – Jerry06