Java 缩小返回类型是否会破坏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

假设我具有以下RMI功能:

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()从返回的对象更改为返回的字符串,那么它在源代码级别的效果非常好