我有一個涉及RMI,序列化和運行時多態性的問題。將子類對象投射到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; }
}
Circle類的cObj
在RMI註冊處註冊的對象:現在
Circle cObj = new Circle (10);
registry.bind("cObj", cObj);
,在客戶端,我有形狀CLASSPATH上的.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類定義。
幫助讚賞。
你試過了嗎?回答這些問題的最好方法是設置一個簡單的測試,然後實際嘗試。它看起來像你有一些有效的代碼。測試它! – rmlan
謝謝。似乎適用於Shape類型,但不適用於Circle類型。由於限制新的人員,無法發佈答案。我明天會發布完整的代碼和觀察結果。 – Pat
如果你提到的是真實的,那麼它將無法與Circle一起工作:「無法訪問Circle類定義」。如果客戶端只知道形狀,它將永遠不能將其轉換爲圓形對象。我真的很驚訝它的作品,甚至只是將其投影到Shape界面。 – rmlan