Функциональный поток Java 11 выводит неверный тип при вызове метода - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть такой код:

public interface Checker<A,B> extends BiFunction<CheckRequest<A>,Function<A,B>,CheckResponse<B>> { // ... }

public class CheckResponse<B> {
  private B operationResponse;

  //...

  public void setOperationResponse(B operationResponse) {
   this.operationResponse = operationResponse;
  }

  public B getOperationResponse() {
    return operationResponse;
  }

}

и такой метод:

public B execute(A req){
  CheckRequest<A> chkReq = //...
  chkReq.setOriginalRequest(req);

  Function<A,B> op = //...

  CheckResponse<B> chkRes= checker.apply(chkReq ,op)
  // [...]
  return chkRes.getOperationResponse();
}

Я хочу завершить выполнение "op"в объект проверки, который будет выполнять некоторые другие побочные эффекты.Мне также нужно обернуть ввод и вывод «op» в proprer CheckRequest и CheckResponse, чтобы передать и получить дополнительные данные.Но затем, чтобы вернуть исходный результат для «op», мне нужен метод getOperationResponse () в CheckResponse.Звучит просто.

Приведенный выше код работает, как и ожидалось, но, если я "встраиваю" его, он выглядит так:

return checker.apply(chkReq ,op).getOperationResponse();

Я получил

несовместимых типов: Java.lang.Object не может быть преобразован в [фактический тип B]

Почему возвращаемый тип getOperationResponse () не выводится правильно, если вызовы методов встроены?

Я используюOpenJDK11 из Oracle:

IMPLEMENTOR = "Корпорация Oracle" IMPLEMENTOR_VERSION = "18,9" JAVA_VERSION = "11" JAVA_VERSION_DATE = "2018-09-25"

Intellij IDEA 2018.3и Maven 3.5.4 в Windows 10.

1 Ответ

0 голосов
/ 06 декабря 2018

Вы должны убедиться, что ваш checker определен в строках, подобных:

Checker<A, B> checker = new Checker<A, B>() {
    @Override
    public CheckResponse<B> apply(CheckRequest<A> aCheckRequest, Function<A, B> abFunction) {
        // perform whatever operation and return a CheckResponse of type B
        return new CheckResponse<>();
    }
};

Несколько базовых предполагаемых завершенных классов здесь:

Ответмодель :

class CheckResponse<B> {
    private B operationResponse;

    public void setOperationResponse(B operationResponse) {
        this.operationResponse = operationResponse;
    }

    public B getOperationResponse() {
        return operationResponse;
    }
}

Запросите модель :

class CheckRequest<A> {
    private A operationRequest;

    public void setOperationRequest(A operationRequest) {
        this.operationRequest = operationRequest;
    }

    public A getOperationRequest() {
        return operationRequest;
    }
}

, и тогда ваше полное определение метода можетбыть

public B execute(A req) {
    CheckRequest<A> chkReq = new CheckRequest<>();
    chkReq.setOperationRequest(req);

    Function<A, B> op;// intialised

    Checker<A, B> checker = new Checker<A, B>() {
        @Override
        public CheckResponse<B> apply(CheckRequest<A> aCheckRequest, Function<A, B> abFunction) {
            // perform whatever operation and return a CheckResponse of type B
            return new CheckResponse<>();
        }
    };

    return checker.apply(chkReq, op).getOperationResponse();
}

Я могу подтвердить, что вышеупомянутое прекрасно работает для меня синтаксически.

...