2017-01-04 3 views
5

先日、Vert.x先物で奇妙な問題が発生しましたが、コードを壊すことはありませんが、まだ気になります。次の警告のパラメータ結果なしVert.x java List <Futures>パラメータ化

未来:

今後は、生タイプです。ジェネリック型の未来への参照パラメータを追加します

パラメータ化する必要があり、問題が解決:

Future<YourClassName> future = ... 

先物のリストを扱うとき、あなたはまた、うまくそれをパラメータ化することができます

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

しかし、CompositeFuture.all()はパラメータ化されたリストを扱えないようで、パラメータを削除する必要があります。

先物のパラメータ化されたリストをCompositeFutureで処理する方法はありますか、その警告を無視するだけですか?それは何も壊すことはありませんが、まだその警告を取り除くための解決策を見いだすのはいいでしょう。

+0

をあなただけunparameterized 1にあなたのリストをキャストすることができます: 'CompositeFuture.all((List )future)'?おそらく、キャスト中に警告が表示されますが、少なくともメソッド呼び出しの外側には、リストにはパラメータ化されたFuturesが含まれます。それ以外に、私はVert.xの開発者と連絡を取り合い、すべてのメソッドのメソッドシグネチャを変更してList > –

+0

@ 911DidBushを受け入れることを検討するかどうかを尋ねることしかできません。 List >からList 'にキャストできません)、それがうまくいっても、問題を1つの場所から別の場所に移動するだけです。 – Rauno

+0

あなたはそうです。私はそれがうまくいけば前にチェックしておくべきだった。キャストの代わりにコピーコンストラクタを使って 'CompositeFuture.all(new ArrayList (future))'に変換することができます。もちろんこれはあなたにはあまり意味がありませんが、少なくとも.all呼び出しの外でListを完全にパラメータ化し、型の安全性を保持することができます。たぶん誰か他の人が別のアイデアを持っているかもしれませんが、vert.xがそのメソッドのシグネチャを変更しない限り、コード内のある時点で生のタイプ+警告を持つ必要があります。 –

答えて

2

一方で、あなたはパラメータ化先物のリストをCompositeFuture.all()を使用することはできません。これは、型の削除のために開発者が行った設計上の決定です。
実際には、CompositeFuture.all()は特別なことはしません。だから、あなたが同じことをするでしょう静的メソッド、使用して独自のインターフェースを有していてもよい:

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()])); 
    } 
} 

そして今:すべてのメソッドに渡すとき

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()は、CompositeFutureを返します。それ自体はFuture<CompositeFuture>です。ですから、生Futureの代わりにFuture<CompositeFuture>に結果を割り当てることができます。

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

リストをどのように役立つのか分かりません。 – Rauno

+0

申し訳ありませんが、私はあなたの質問をあまりにも早く読む – tsegismont