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 に Shape.class ファイルがありますが、CLASSPATH に Circle.class ファイルがありません。RMI クライアントで以下を実行することは可能ですか?
Shape obj = (Shape) registry.lookup("cObj");
obj.getArea();
Circle.class は RMI クライアントの CLASSPATH になく、クライアントのコードは Circle クラスを直接参照していないことに注意してください。Shape インターフェイス タイプのみを参照しています。
これをどのように見るかというと、クライアントがルックアップを実行し、cObj 名と Circle タイプのオブジェクトを見つける可能性があります。サーバーは Circle が Shape のサブタイプであることを認識し、オブジェクトをシリアル化してクライアントに送信します。現在、クライアントが Circle クラス定義にアクセスせずにそれをスーパークラス (Shape) 型にキャストできるかどうかはわかりません。
助けていただければ幸いです。