Согласно документации, executeBlocking
метод интерфейса Vertx
имеет следующую подпись:
<T> void executeBlocking(Handler<Future<T>> blockingCodeHandler, boolean ordered, Handler<AsyncResult<T>> resultHandler)
Вопрос в том, почему (с формальной точки зрения) следование делает Java неспособным выводить универсальный тип для Future<T>
(выводится Future<Object>
):
vertx.executeBlocking((deploymentFuture) -> {
this.deploy();
deploymentFuture.complete(new Boolean(true));
}, (asyncResult) -> {
start.complete();
});
Даже если deploymentFuture
явно присвоено Boolean
.Только этот явный вызов дает Java представление о Future<Boolean>
:
vertx.<Boolean>executeBlocking((deploymentFuture) -> {
this.deploy();
deploymentFuture.complete(new Boolean(true));
}, (asyncResult) -> {
start.complete();
});
Почему так сложно выводить типы в таком случае использования?Это потому, что неизменность типа (аналогично ArrayList<Integer>
против ArrayList<Number>
).
В основном без явного типа вызова я выброшен с
No instances of type variable T exist so that Future<T> conforms to Future<Object>