javarmi代理问题

javarmi代理问题,java,proxy,rmi,Java,Proxy,Rmi,我得到这个错误: java.lang.ClassCastException: $Proxy0 cannot be cast to rmi.engine.Call at Main.main(Main.java:39) 我的Abstract和Call类都扩展了Remote 电话: 摘要: public interface Abstract extends Remote { String getHello() throws RemoteException; } 这是我

我得到这个错误:

 java.lang.ClassCastException: $Proxy0 cannot be cast to rmi.engine.Call
        at Main.main(Main.java:39)
我的
Abstract
Call
类都扩展了
Remote

电话:

摘要:

public interface Abstract extends Remote {

    String getHello() throws RemoteException;

}
这是我的主要观点:

public static void main(String[] args) {
    if (args.length == 0) {
        try {
            System.out.println("We are slave ");
            InetAddress ip = InetAddress.getLocalHost();
            Registry rr = LocateRegistry.
                getRegistry(ip.getHostAddress(), Store.PORT, new RClient());

            Object ss = rr.lookup("FILLER");

            System.out.println(ss.getClass().getCanonicalName());
            System.out.println(((Call)ss).getHello());

        } catch (Exception e) {
            e.printStackTrace();
        }
    } else {
        if (args[0].equals("master")) {
            // Start Master
            try {
                RMIServer.start();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
Netbeans说问题出在第39行

    System.out.println(((Call)ss).getHello());
输出如下所示:

运行:


我正在cmd中运行一个master,监听端口5225。

$Proxy0
是一个,也就是说,一个类是由java在运行时生成的

此类应实现接口
抽象
,但不扩展
调用
。因此,您不能将其向下转换为
调用
(这将提供一个类转换),但将其向下转换为
抽象
应该可以

如果您使用RMI,您应该只通过接口与远程对象通信


附:
摘要
是一个令人困惑的名字。我真的以为是你先说的。如果可能的话,我会重新命名。对于
rmi.engine
,也更喜欢类似于
org.myproject
,以避免与JDK的内部类混淆。

非常感谢您指出了明显的错误!救命恩人!对我真的很有帮助。因为我还创建了服务器实现的对象,而不是接口。您应该记住,无论何时调用服务器程序(即远程方法),都应该通过定义的接口调用它们。
    System.out.println(((Call)ss).getHello());
We are slave 
Connecting 10.0.0.212:5225
$Proxy0
java.lang.ClassCastException: $Proxy0 cannot be cast to rmi.engine.Call
        at Main.main(Main.java:39)

BUILD SUCCESSFUL (total time: 1 second)