我有这种代码:
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”的输入和输出包装到适当的CheckRequest和CheckResponse中,以传递并获取其他数据。但是,为了获取“ op”的原始结果,我需要在CheckResponse中使用getOperationResponse()方法。听起来很简单。
上面的代码按预期工作,但是,如果我将其“内联”为:
return checker.apply(chkReq ,op).getOperationResponse();
我知道了
不兼容的类型:java.lang.Object无法转换为[actual B的类型]
如果方法调用是内联的,为什么不能正确推断getOperationResponse()的返回类型?
我正在使用Oracle的OpenJDK11:
IMPLEMENTOR =“ Oracle Corporation” IMPLEMENTOR_VERSION =“ 18.9” JAVA_VERSION =“ 11” JAVA_VERSION_DATE =“ 2018-09-25”
Windows 10上的Intellij IDEA 2018.3和Maven 3.5.4。
答案 0 :(得分:2)
您需要确保在类似于以下内容的行上定义了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();
}
我可以从语法上确认以上方法对我来说很好。