假设我有以下RMI功能:
Object foo();
唯一的实现是
Object foo() { return "some string"; }
如果客户端和服务器没有一步释放,我可以将返回类型缩小到String
而不破坏向后兼容性吗?
答案 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。