2

關於Varargs,我可以重複一組中的參數嗎?可變參數在一組?

舉例來說,我希望允許用戶通過在:

myFunc(1, "one"); 
myFunc(1, "one", 2, "two"); 
myFunc(1, "one", 2, "two", 3, "three"); 

這似乎是不可能的。但正如docs所述,可變參數實際上是一箇舊的實現中的數組。我想知道如何人做之前 varargs是發明。這可能會激勵我們如何實現上述情景。我們可以把我的情景視爲{int, String}...重複。

感謝任何輸入:-)

編輯:

感謝您的投入!

那麼,是否通過myFunc(new wrap(1, "one"), new wrap(2, "two"), new wrap(3, "three"));來撥打方法?

編輯2:

好吧,不。那是我混亂的錯。

對於

myFunc(1); 
myFunc(1, 2); 
myFunc(1, 2, 3); 

的方法應該是

myFunc(new int[]{1}); 
myFunc(new int[]{1, 2}); 
myFunc(new int[]{1, 2, 3}); 

據我所看到的,作爲重複參數形成一個陣列。它的所有參數必須是相同的類型。以簡單的方式實現上述呼叫應該是不可能的。爲了好奇,我開始考慮操作符超載的可能性......(?)

回答

3

在這種情況下,在我看來,適合爲「對」創建數據結構,然後使用該類型作爲可變參數你的方法的論點。

public void myFunc(Pair... pairs) {} 

你也可以使用Object...,但我不認爲在這種情況下,任何的優勢,因爲參數總是成對出現。

作爲一個方面說明,我真的很想念斯卡拉元組爲這些類型的數據狹窄...

+0

感謝@NilsH。然而,在使用時,用戶必須執行'myFunc(新對(1,「一」),新對(2,「2」),新對(3,「3」);',不是嗎?縮短了嗎?或者在更方便的方式使用? – midnite

+0

是的,你就必須做到這一點。如果你不想這樣,你將不得不使用'對象...'然後檢查並投下你的方法裏面的參數,而不是。但是,這將開闢你的方法的不正確使用,所以我不會建議。 – NilsH

+0

燁確實如此。和使用'對象...'能不能守住的參數的個數是偶數,對嗎? – midnite

2

有關創建這兩個參數一起包裝的包裝類是什麼?

public class TwoParameter 
{ 
    private int intValue; 
    private String stringValue; 

    public TwoParameter(int intValue, String stringValue) 
    { 
     this.intValue = intValue; 
     this.stringValue = stringValue; 
    } 

    // getters and setters 
} 

,然後用它喜歡:

myFunc(new TwoParameter(1, "one"), new TwoParameter(2, "two")); 

的方法的簽名是這樣的:

public void myFunc(TwoParameter... params){...} 
+0

感謝@ Eng.Fouad是我最關心的是,在調用時,'myFunc的(新的雙參數(1,「1」),新的雙參數(2,「二」));'似乎「長」和複雜的就是它。 ?可縮短它在某種程度上 – midnite

1

變參進行了介紹,讓您可以發送任意數量參數的一個函數。在他們出現之前,人們就會與其他集合/數組混合在一起。

你可以達到你想要的自定義結構是什麼。結構的細節將取決於名稱值對應實現的內容。這是任何NameValue對的通用解決方案。

的NameValuePair

class NameValuePair<K,V> 
{ 
    private K key; 
    private V value; 
    public K getKey() 
    { 
     return key; 
    } 
    public void setKey(K key) 
    { 
     this.key = key; 
    } 
    public V getValue() 
    { 
     return value; 
    } 
    public void setValue(V value) 
    { 
     this.value = value; 
    } 
} 

使用

private <K,V> void method(NameValuePair<K, V>... pairs) 
{ 
    for (NameValuePair<K, V> nameValuePair : pairs) 
    { 
     K key = nameValuePair.getKey(); 
     V value = nameValuePair.getValue(); 
     // logic goes here 
    } 
} 
+0

感謝@Deepak巴拉雖然我的圖書館用戶使用它,他們仍然要做'的NameValuePair NVP =新的NameValuePair(); nvp.setKey(1); nvp.s etValue( 「1」);方法(nvp,nvp,nvp);',不是嗎?是否可以編寫更少的代碼並讓用戶像我的問題中的示例那樣調用'method'? - 它似乎更加用戶友好。 – midnite

+0

Java是強類型的,所以實現你想要的唯一方法是使用Object ... args。雖然這對於調用者來說很好,但方法實現看起來很髒,因爲它需要'instanceof'來確定類型。我會堅持讓調用者更難,而不是用'instanceof'編寫髒代碼。 –

+0

我明白了。謝謝。這真是一個很好的考慮因素。 – midnite

1

有使用其他的解決方案很好的理由,但他們都介紹了一下雜亂的(創建所有這些對象),你可能不希望讓你的圖書館的用戶接受。

您可以將雜亂轉移到你的方法裏面,像這樣:然後

public void example(final Object... args) { 
    if (args.length % 2 != 0) 
     throw new IllegalArgumentException("int, String pairs are required, but there seems to be an odd one out"); 

    for (int i = 0; i < args.length; i += 2) { 
     int a = (Integer) args[i]; 
     String b = (String) args[i + 1]; 

     System.out.printf("%d: %s\n", a, b); 
    } 
} 

example(1, "Hello", 2, "Goodbye", 25, "Raptors will eat you!");將產生以下的輸出:

1: Hello 
2: Goodbye 
25: Raptors will eat you!