假设我有以下RMI函数:
唯一的实现是
Object foo();
唯一的实现是
Object foo() { return "some string"; }
如果客户端和服务器不能一步到位,我能否缩小返回类型为String
而不影响向后兼容性?
Object foo();
Object foo() { return "some string"; }
如果客户端和服务器不能一步到位,我能否缩小返回类型为String
而不影响向后兼容性?
如果你在服务器端更改了远程接口为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,则该源代码级别的功能完全正常。
这是一道 Java 语言问题,不仅仅是 RMI 问题。答案是“不行”,你将会得到一个 NoSuchMethodError。