2013-01-06 198 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)