我有一个涉及 RMI、序列化和运行时多态性的问题。
我有一个 RMI 服务器,其内容如下:
public interface Shape extends Remote, Serializable {
public double getArea() throws RemoteException;
}
public class Circle implements Shape {
double radius;
public Circle( double r) { radius = r; }
public double getArea() { return Math.PI * radius * radius; }
}
cObj
在 RMI Registry 中注册了 Circle 类的对象:
Circle cObj = new Circle (10);
registry.bind("cObj", cObj);
现在,在客户端,我在 CLASSPATH 上有 Shape.class 文件,但在 CLASSPATH 上没有 Circle.class 文件。RMI 客户端是否可以执行以下操作?
Shape obj = (Shape) registry.lookup("cObj");
obj.getArea();
请注意,Circle.class 不在 RMI 客户端的 CLASSPATH 中,并且客户端上的代码无论如何都没有直接引用 Circle 类。它仅引用 Shape 接口类型。
我会怎么看,可能是客户端执行查找并找到具有 cObj 名称和 Circle 类型的对象。服务器知道 Circle 是 Shape 的子类型,并将对象序列化并发送给客户端。现在,我不确定客户端是否可以将其转换为超类(Shape)类型而无需访问 Circle 类定义。
帮助表示赞赏。