2014-07-01 13 views
0

您可以定義接受任何東西的方法(Object... arguments)但是,如果您使用("A", "B")(["A", "B"])調用它,則arguments的值將與["A", "B"]相同 - 即原始簽名將丟失。方法接受任何東西並保留簽名?

有什麼辦法可以保存它嗎?

P.S.爲什麼我需要它:

要記住被調用的方法和參數,然後通過反射回復它。當它打破例如:

有一個對象與方法我想以後調用:

MyObj { 
    myMeth (String[] array) {...} 
} 
myObj = new MyObj() 

我告訴計算機與一些參數以後調用它。

callLater(myObj, "myMeth", ["A", "B"]) 

它記得它和用戶反射找到實際的方法並調用它。 它失敗了,因爲原始簽名丟失了,而不是(String[])它試圖找到(String, String)

+0

如果正確地記得在反射,可變參數被處理的作爲數組總是。所以你需要能夠搜索'Object []'作爲方法參數 – MadProgrammer

+0

'原始簽名將會丟失'並不意味着什麼。它不會丟失。它只是通過兩個不同的參數列表來調用,這是整個想法。目前尚不清楚你的問題實際上是什麼。 – EJP

回答

1

這種歧義在調用方通過使用強制轉換解決。在這種情況下,您首先將陣列轉換爲(Object),將其視爲可變參數參數。例如,到陣列通過作爲一個參數:

callLater(myObj, "myMeth", (Object) new String[] {"A", "B"}); 

要傳遞兩個參數:

callLater(myObj, "myMeth", (Object[]) new String[] {"A", "B"}); 

或簡單地:

callLater(myObj, "myMeth", "A", "B"); 
+0

謝謝,但這不是很方便,有沒有更好的方法?我想用它作爲DSL並保持它簡單和美觀。 –

+0

如果你想要「更好」的東西,你將不得不提供你的方法的兩個版本(命名不同;不能重載),一個採用可變參數和一個直接採用數組。 –

+0

試過了,編譯器禁止同名兩個'(Object ... data)'和'(Object [] data)'方法。 –