2013-01-06 155 views
0

我写这段代码:Java接口继承

package sample; 
import org.freedesktop.dbus.DBusInterface; 
import org.freedesktop.dbus.DBusInterfaceName; 
import org.freedesktop.dbus.DBusConnection; 

@DBusInterfaceName("org.mpris.clementine") 
interface Player extends DBusInterface, java.rmi.Remote { 
    void Pause(); 
} 


class Main { 
     public static void main (String[] args) throws org.freedesktop.dbus.exceptions.DBusException, java.lang.InterruptedException { 
       DBusConnection dc = DBusConnection.getConnection(DBusConnection.SESSION); 
       Player player = (Player) dc.getRemoteObject("org.mpris.clementine", "/Player"); 
       player.Pause(); 
       dc.disconnect(); 
     } 
} 

而且在线路得到一个错误

Player player = (Player) dc.getRemoteObject("org.mpris.clementine", "/Player"); 

它说,

Exception in thread "main" java.lang.ClassCastException: $Proxy2 cannot be cast to sample.Player 

我知道问题出在继承误解或者这样的行为。我已经彻底搜寻,但我找不到答案。如何正确书写这一行?那错误是什么?

+0

的问题是,你认为你会得到一些扩展/实现的球员,但你不是。你得到某种自动生成的代理,不扩展/实现播放器。也许它的名单?我不知道。我建议在那里设置一个断点,并运行一些instanceof检查来查看你有什么。你可以发布这个连接的另一面吗? “/ Player”下的“绑定”是什么? – radai

回答

0

你应该确保在类的

dc.getRemoteObject 

返回实现接口的播放器

0

用这个代替:

Object obj = dc.getRemoteObject("org.mpris.clementine", "/Player"); 
if(obj instanceof Player) { 
    Player player = (Player) obj; 
    player.pause(); 
} 
+0

亚历克斯K,我用这个,但我得到了同样的错误行 – user1933770

+0

错误是,你从'dc.getRemoteObject()'得到的对象实现'DBusInterface',但不是'播放器'。为了能够将其转换为'Player',继承序列必须是相反的,例如'DBusInterface extends Player'。 现在没有程序可以运行的'pause()'方法实现。使用'instanceof'进行测试可以防止执行强制转换,并且在我的测试中这样做。 –

+1

也看到[这个问题](http://stackoverflow.com/questions/8656268/accessing-clementine-instance-via-d-bus-mpris-in-java) –

0

不知道什么是 'dc.getRemoteObject()' ,如果它是远程操作,则需要解除对象的封送。

Object obj = dc.getRemoteObject(“org.mpris.clementine”,“/ Player”);

Player播放器=(播放器)PortableRemoteObject.narrow(OBJ,Player.class)