java.lang.ClassCastException:com.sun.proxy。$ Proxy1无法强制转换为

时间:2016-12-11 04:16:43

标签: java rmi rmiregistry

服务器

Registry registry = LocateRegistry.createRegistry(1099);

InventoryInterface Inventory = new Inventory(registry);

registry.bind("Inventory", Inventory);

客户端:

Registry registry = LocateRegistry.getRegistry(1099);


InventoryInterface inventory = (InventoryInterface) registry.lookup("Inventory");


String product_id = inventory.newProduct();

ProductFacade product_1 = (ProductFacade) registry.lookup(product_id);

问题是在转换时发生异常,在这种情况下,它发生在:ProductFacade product_1 = (ProductFacade) registry.lookup(product_id);

例外:

Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy2 cannot be cast to rmi.ProductFacade

2 个答案:

答案 0 :(得分:1)

在您查找的名称下绑定到注册表的任何内容都不会实现rmi.ProductFacade远程接口。

  

所以我想知道我是否应该在再次投射之前重新启动注册表

当然不是。 (a)您无法从客户端重新启动它,并且(b)您将获得的只是一个空的注册表。这个建议没有意义。

很难理解为什么InventoryInterface.newProduct()会返回String而不是实际的新ProductFacade对象。另外,为什么listAllProducts()会返回String而不是String[]。如果没有如下大量使用注册表,我会重新设计它:

public interface InventoryInterface extends Remote {    
    public ProductFacade newProduct() throws RemoteException;
    public ProductFacade getProduct(String id) throws RemoteException;    
    public String[] listAllProducts() throws RemoteException;
}

答案 1 :(得分:0)

它可以是关于你如何绑定它。例如,如果ProductFacade实现InventoryInterface,则可能需要将其强制转换为InventoryInterface而不是ProductFacade。