2017-07-04 64 views
0

可以說我有對象X和對象B.X是一個隨機類的對象,它依次創建B,並將其自身作爲變量存儲在對象B中。Java - 是否可以在任何對象上調用接口方法?

現在對象B想要在對象X中運行方法,而不知道它是什麼類。

是否可以在任何對象中調用某個方法,並且如果具有該名稱的方法存在,它將運行,如果不存在,則不會。我假設一些try/catch可以解決這個問題。

但可以說,我有這樣的事情:

public class ObjectB { 

    public Object parentX; 

    public ObjectB(Object x) { 
    parentX = x; 
    } 

    public void anyMethod() { 
    x.runMyMethod(); 
    } 
} 

在另一個程序和我一起工作,這是可能的接口,因此有一個想法,這可能與Java太。但是,我似乎無法找到設置的方法。所以如果上述情況是這樣的話,那麼如何設置它,以便ObjectB可以在我的程序中的所有類上調用該方法,如果這正是我想要的?

+1

調用方法,'x'必須是實現該接口的類的實例。 (你的意思是'parentX'?) –

+1

不,唯一的方法就是使用反射,但反射大部分時間不是正確的答案。你應該通過修復你的設計來做到這一點。但是,如果不知道自己想要達到什麼目標,在更高的層次上,很難回答。 –

+0

使用接口,而不是'Object'作爲'x'和'parentX'的類型。 –

回答

1

是的,它絕對有可能。

定義界面MyIntf,你的Class X實現它。現在在B級可以分配的Class X對象(或實現MyIntf任何類)父其中MyIntf類型的可以如果要調用該方法與該父

interface MyIntf 
    { 
     void runMyMethod() 
    } 

    public class ObjectX implements MyIntf { 
      void runMyMethod() 
      { 
      } 
    } 

    public class ObjectB { 

     public MyIntf parentX; 

     public ObjectB(MyIntf x) { 
     parentX = x; 
     } 

     public void anyMethod() { 
     parentX.runMyMethod(); 
     } 
    } 
0

如果你看看這個documentation的結尾,它會告訴你鑄造。 Casting允許程序假定該對象是一個類型,並嘗試調用其中的方法。

public void anyMethod() { 
    ((MethodParentObject) this.x).runMyMethod(); 
} 
2

現在對象B,要運行對象X的方法,不知道它是什麼類。

根本沒有意義。爲了調用一個方法,你需要知道它的名字和期望的參數。從這個意義上說,B類需要一些知識。因此,你會/可以做類似

if (parentX instanceof ClassA) { 
((ClassA) parentX) . someAMethod(bla, blub); 
} 
if (parentX instanceof InterfaceC) { 
((InterfaceC) parentX) . someCMethod(bla, blub); 
} 

在這個意義上說:你可以在這裏使用的接口;但類也適用。關鍵是:你需要一些信息;否則你只是卡住了。

唯一的另一種選擇是調查reflection - 那麼你不需要知道具體的類型;因爲您可以檢查parentX以找出可以在該對象上調用哪些方法。但反思是:a)先進的理念,b)用法錯綜複雜。

相關問題