缩小返回类型是否会破坏RMI的向后兼容性?

时间:2013-12-10 14:56:38

标签: java rmi backwards-compatibility

假设我有以下RMI功能:

Object foo();

唯一的实现是

Object foo() { return "some string"; }

如果客户端和服务器没有一步释放,我可以将返回类型缩小到String而不破坏向后兼容性吗?

2 个答案:

答案 0 :(得分:4)

如果将服务器端的远程接口更改为String foo();,但尝试使用具有Object foo();的旧远程接口类文件运行客户端,则会出现如下异常:< / p>

java.rmi.UnmarshalException: unrecognized method hash: method not supported by remote object

RMI散列名称,参数类型和返回类型,并查找完全匹配。不考虑新版本可能兼容的事实。

正如EJP所说,这也是一个Java语言问题。如果您尝试针对新接口运行客户端二进制文件(无需重新编译),您将获得NoSuchMethodError,因为此更改不是二进制兼容的。

然而,这是与源兼容的更改,因为现有客户端源可能会执行类似

的操作
String result = (String)stub.foo();

如果foo()从返回Object更改为返回String,则在源代码级别上可以正常工作。

答案 1 :(得分:2)

这是一个Java语言问题,而不仅仅是一个RMI问题。答案是'不':你会得到一个NoSuchMethodError。