2

在编写 JAXWS 客户端时,这是我过去使用的:

// CALL SERVICE
EPaymentsService bPayService = new EPaymentsService();
ServiceInterface stub = bPayService.getPort();
BindingProvider bp = (BindingProvider) stub;
Map<String, Object> rc = bp.getRequestContext();
String endPointUrl = propFile.getString(Constants.END_POINT_URL);
rc.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endPointUrl);
// RESPONSE
ResponseMessage resMessage = stub.sendMessage(reqMessage);

在我的代码中,ServiceInterface 没有扩展 BindingProvider。那么为什么我们在转换时没有收到错误

BindingProvider bp = (BindingProvider) stub;
4

1 回答 1

6
BindingProvider bp = (BindingProvider) stub;

这是一个缩小的参考转换。根据 Narrowing reference conversion 的规则之一,K可以将接口类型分配给非参数化接口类型J,前提K是它不是的子类型(如果是 的子类型,J则不需要显式转换) .KJ

J j = (J) K;

如果转换失败,则在运行时抛出 ClassCastException。

InputStream in = System.in;
Runnable r = (Runnable) in;

上面的代码片段可以编译,因为InputStreamRunnable都是非参数化接口,但会ClassCastException在运行时生成。

转换from ServiceInterfacetoBindingProvider有效,因为getPort返回一个实现接口的动态代理类WSBindingProvider,而后者又扩展了BindingProvider接口。

于 2013-07-15T12:55:40.773 回答