2017-01-04 1 views
5

요즘 Ver.x 선물에 이상한 문제가있어서 코드를 깨뜨리지는 않지만 여전히 괴롭 힙니다. 다음과 같은 경고의 매개 변수 결과없이Vert.x java List <Futures> 매개 변수화

미래 :

미래 원시 유형입니다. 제네릭 형식 미래에 대한 언급이 매개 변수를 추가

을 매개 변수화해야 문제가 해결 :

Future<YourClassName> future = ... 

선물의 목록을 다루는, 당신은 또한 잘 그것을 매개 변수화 할 수 있습니다

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

그러나 CompositeFuture.all()은 매개 변수화 된 목록을 처리 할 수 ​​없으므로 매개 변수를 제거해야합니다.

선물의 매개 변수화 된 목록을 CompositeFuture으로 작동시키는 방법이 있습니까? 아니면 해당 경고를 무시하면됩니까? 그것은 아무 것도 깨지 않지만 그 경고를 없애기위한 해결책을 찾는 것이 여전히 좋을 것입니다.

+0

당신은 단지 unparameterized 하나에 목록을 시전 할 수 :'CompositeFuture.all ((List ) future)'? 캐스팅 중에도 경고 메시지가 표시되지만, 적어도 메서드 호출 외부에는 List에 매개 변수가있는 Futures가 포함됩니다. 그 외에는 vert.x 개발자와 접촉하여 모든 메서드의 메서드 시그니처를 변경하여 List > –

+0

@ 911DidBush를 허용 할 것인지를 묻는 질문 만하면됩니다 (결과 in List >에서 List 로 캐스팅 할 수 없음) 오류가 발생하고 문제가 해결 되더라도 문제를 한 곳에서 다른 곳으로 옮길 수 있습니다. – Rauno

+0

네 말이 맞아. 그게 효과가 있었는지 전에 확인 했어야했다. 그러나 당신은 캐스팅 대신에 복사 생성자를 사용하여'CompositeFuture.all (new ArrayList (future))'로 변환 할 수 있습니다. 당신은 물론 당신에게 많은 것을주지는 않지만 적어도 .all 호출 밖에서리스트를 완전히 매개 변수화하고 몇 가지 유형 안전성을 유지할 수는 있습니다. 어쩌면 다른 사람이 다른 생각을 가지고있을 수도 있지만 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>입니다. 그래서 대신 원시 FutureFuture<CompositeFuture>에 결과를 할당 할 수

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

어떻게 목록에 도움이 될지 모르겠습니다. – Rauno

+0

죄송합니다. 질문을 너무 빨리 읽었습니다. – tsegismont