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

4
假设我有以下RMI函数:
Object foo();

唯一的实现是
Object foo() { return "some string"; }

如果客户端和服务器不能一步到位,我能否缩小返回类型为String而不影响向后兼容性?

2个回答

4

如果你在服务器端更改了远程接口为String foo();,但试图使用具有Object foo();的旧远程接口类文件运行客户端,则会出现以下异常:

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

RMI会对名称、参数类型和返回类型进行哈希,然后寻找精确匹配。新版本可能兼容的事实不被考虑。

正如EJP所说,这也是一个Java语言问题。如果您尝试在不重新编译的情况下运行客户端二进制文件以针对新接口,则会收到NoSuchMethodError,因为此更改不具有二进制兼容性。

但是,这是一个源代码兼容的更改,因为现有的客户端源代码可能执行类似以下操作:

String result = (String)stub.foo();

如果将foo()从返回Object更改为返回String,则该源代码级别的功能完全正常。


2

这是一道 Java 语言问题,不仅仅是 RMI 问题。答案是“不行”,你将会得到一个 NoSuchMethodError。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接