Java 缩小返回类型是否会破坏RMI向后兼容性?
假设我具有以下RMI功能:Java 缩小返回类型是否会破坏RMI向后兼容性?,java,rmi,backwards-compatibility,Java,Rmi,Backwards Compatibility,假设我具有以下RMI功能: Object foo(); 唯一的实现是 Object foo() { return "some string"; } 如果客户端和服务器不是一步释放的,我是否可以在不破坏向后兼容性的情况下将返回类型缩小为字符串?这是一个Java语言问题,而不仅仅是RMI问题。答案是“否”:如果将服务器端的远程接口更改为String foo(),您将得到一个NoSuchMethodError。但尝试使用具有对象foo()的旧远程接口类文件运行客户端您将得到如下异常: java.r
Object foo();
唯一的实现是
Object foo() { return "some string"; }
如果客户端和服务器不是一步释放的,我是否可以在不破坏向后兼容性的情况下将返回类型缩小为
字符串?这是一个Java语言问题,而不仅仅是RMI问题。答案是“否”:如果将服务器端的远程接口更改为String foo(),您将得到一个NoSuchMethodError。
但尝试使用具有对象foo()的旧远程接口类文件运行客户端代码>您将得到如下异常:
java.rmi.UnmarshalException: unrecognized method hash: method not supported by remote object
RMI散列名称、参数类型和返回类型,并查找精确匹配。不考虑较新版本可能兼容的事实
正如EJP所说,这也是一个Java语言问题。如果尝试对新接口运行客户端二进制文件(无需重新编译),将得到NoSuchMethodError
,因为此更改与二进制文件不兼容
然而,这是一个与源代码兼容的更改,因为现有的客户机源代码可能会执行以下操作
String result = (String)stub.foo();
如果foo()从返回的对象更改为返回的字符串,那么它在源代码级别的效果非常好