在编写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.So为什么我们在转换时不会出错
BindingProvider bp = (BindingProvider) stub;
答案 0 :(得分:5)
BindingProvider bp = (BindingProvider) stub;
这是一个缩小的参考转换。根据缩小参考转换的规则之一,可以将接口类型K
分配给非参数化接口类型J
,前提是K
不是J
的子类型1}}(如果K
是J
的子类型,则不需要显式转换。
J j = (J) K;
如果转换失败,则在运行时抛出ClassCastException。
InputStream in = System.in;
Runnable r = (Runnable) in;
上面的代码段编译是因为InputStream
和Runnable
都是非参数化接口,但在运行时会产生ClassCastException
。
从ServiceInterface
到BindingProvider
的强制转换有效,因为getPort
返回一个实现WSBindingProvider
接口的动态代理类,后者又扩展了BindingProvider
接口