2013-01-06 3 views
0

인터페이스 상속 :자바 나는이 코드를 작성했습니다

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

사용을 구현 : 'dc.getRemoteObject()가'무엇을하는지 확실하지

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

Alex K, 나는 이것을 사용했다. 그러나 나는 같은 실수를한다. – user1933770

+0

이 에러는'dc.getRemoteObject()'에서 얻은 객체가'DBusInterface'를 구현하지만'Player'는 구현하지 않는다는 것이다. 'Player'로 캐스팅 할 수 있으려면 상속 시퀀스가'DBusInterface extends Player'처럼 다른 방향으로 있어야합니다. 지금은 프로그램이 실행할 수있는 '일시 중지()'메소드 구현이 없습니다. 'instanceof'를 사용한 테스트는 캐스트가 실행되는 것을 방지해야하며 테스트에서 그렇게합니다. –

+1

도 [이 질문을 참조하십시오] (http://stackoverflow.com/questions/8656268/accessing-clementine-instance-via-d-bus-mpris-in-java) –

0

을 , 원격 조작의 경우 객체를 비 정렬 화해야합니다.

개체 obj = dc.getRemoteObject ("org.mpris.clementine", "/ Player");

플레이어 플레이어 = (플레이어)하면 PortableRemoteObject.narrow (OBJ, Player.class)

관련 문제