2017-01-04 2 views
5

Je me suis heurté à un problème étrange avec Vert.x futures l'autre jour qui ne casse pas le code mais me dérange encore.Vert.x java Liste <Futures> paramétrisation

avenir sans paramètre entraîne l'avertissement suivant:

Future est un type brut. Les références à type générique avenir devrait être paramétrés

Ajoutez le paramètre, le problème est résolu:

Future<YourClassName> future = ... 

Lorsque vous traitez avec une liste des contrats à terme, vous pouvez également paramétrer très bien:

List<Future<YourClassName>> future = ... 

Mais CompositeFuture.all() ne semble pas traiter une liste paramétrée et vous force à supprimer le paramètre.

Existe-t-il un moyen de faire fonctionner la liste paramétrée des contrats à terme avec CompositeFuture ou devons-nous ignorer cet avertissement? Il ne casse rien mais serait toujours agréable de trouver une solution pour se débarrasser de cet avertissement.

+0

Pouvez-vous jeter votre liste à un un paramétrées lors du passage à la méthode entièrement : 'CompositeFuture.all ((Liste ) future)'? Cela vous donnera probablement encore un avertissement lors du lancement, mais au moins en dehors de l'appel de méthode, votre liste contiendra des Futures qui sont paramétrés. En dehors de cela, je ne peux penser à entrer en contact avec les développeurs vert.x et leur demander s'ils envisageraient de changer la signature de la méthode de tous pour accepter la liste > –

+0

@ 911DidBush vous ne pouvez pas le faire de cette façon (résultats dans Impossible de passer de l'erreur 'List > à la liste ') et même si cela fonctionnait, vous déplaceriez simplement le problème d'un endroit à un autre. – Rauno

+0

Vous avez raison. J'aurais dû vérifier avant si cela fonctionnait. Au lieu de lancer, vous pouvez cependant utiliser le constructeur de copie pour le convertir 'CompositeFuture.all (new ArrayList (future))'. Vous avez bien sûr raison de dire que cela ne vous donne pas grand-chose, mais au moins vous pouvez garder la liste entièrement paramétrée en dehors de l'appel .all et conserver une certaine sécurité de type. Peut-être que quelqu'un d'autre a une autre idée, mais à moins que vert.x change la signature de cette méthode, vous devrez probablement avoir le type + avertissement brut à un moment donné dans votre code. –

Répondre

2

D'une part, vous ne pouvez pas utiliser CompositeFuture.all() avec la liste des contrats à terme paramétrées. C'est une décision de conception que les développeurs ont prise, en raison de l'effacement de type. En réalité, CompositeFuture.all() ne fait rien de spécial. Ainsi, vous pouvez avoir votre propre interface avec méthode statique, qui va faire la même chose:

interface MyCompositeFuture extends CompositeFuture { 

    // This is what the regular does, just for example 
    /* 
    static CompositeFuture all(List<Future> futures) { 
     return CompositeFutureImpl.all(futures.toArray(new Future[futures.size()])); 
    } 
    */ 

    static <T> CompositeFuture all(List<Future<T>> futures) { 
     return CompositeFutureImpl.all(futures.toArray(new Future[futures.size()])); 
    } 
} 

Et maintenant:

List<Future<String>> listFuturesT = new ArrayList<>(); 
    // This works 
    MyCompositeFuture.all(listFuturesT); 

    List<Future> listFutures = new ArrayList<>(); 
    // This doesnt, and that's the reason for initial design decision 
    MyCompositeFuture.all(listFutures); 
-1

CompositeFuture.all() renvoie CompositeFuture, qui est lui-même Future<CompositeFuture>. Ainsi, vous pouvez affecter le résultat à un Future<CompositeFuture> au lieu d'une Future brute:

Future<String> fut1 = asyncOp1(); 
Future<Integer> fut2 = asyncOp2(); 
Future<CompositeFuture> all = CompositeFuture.all(fut1, fut2); 
+0

Je ne vois pas comment ça va aider avec les listes. – Rauno

+0

Vous avez raison désolé, j'ai lu votre question trop rapidement – tsegismont