2011-09-10 17 views
10

Gibi bir yöntem var:Dönüş tipi vararg?

void foo(int x, Grok... groks); 

Bir varargs türünü döndüren bir yöntemi tanımlamanın yolu yoktur, değil mi? İdeal olarak ek bir kullanım yöntemi istiyorum:

foo(25, new Grok(), new Grok(), generateMoreGroks()); 

public Grok... generateMoreGroks() { 
    return new Grok[] { 
     new Grok(), new Grok(), new Grok() }; 
} 

doğru mu?

---- Daha fazla bilgi --------------

Yukarıdaki sorun, orada bir dizi ile ayrılan birkaç Grok örneğini karıştıramamamızdır. Groks:

 "new Grok(), new Grok(), generateMoreGroks());" 

ve ben bir tür vararg (sanırım) döndürmek için bir yöntem tanımlayamazsanız, bunun yasal olduğunu düşünmüyorum.

Teşekkürler

cevap

8

bunu yapabilirsiniz, bir yöntem, bir varargs parametre alıyorsa

Grok[] generateMoreGroks() { 

, bir dizi alarak aynıdır.

Artık bazı Grok örneklerini almaya izin vermek için foo aşırı gerekir ve varargs olarak dinlenme, foo yöntemleri gibi

foo(int x, Grok... rest) 
foo(int x, Grok g1, Grok... rest) 
foo(int x, Grok g1, Grok g2, Grok... rest) 
foo(int x, Grok g1, Grok g2, Grok g3, Grok... rest) 

,

foo(int x, Grok g1, Grok... rest) { 
    Grok[] groks = new Grok[rest.length + 1]; 
    groks[0] = g1; 
    System.arrayCopy(rest, 0, groks, 1, rest.length); 
    foo(x, groks); 
} 

Bu biraz çirkin .

+2

evet Merhaba ama varargs parametresinde bazı Grok durumlarda içeren bir dizi karştramazsnz (foo çağrısında olarak() Yukarıdaki). Sadece bir dizi veya tek bir Grok örneği verebilirim. Ama ikiside değil? – user291701

+0

@ user291701 - Bu doğru. –

+0

nasıl yapılacağını göstermek için düzenlenmiş, bu çirkin olsun – sbridges

4

Hayır yok ... ama işlev imzasını değiştirecek ve bu da gayet güzel çalışıyor.

public Grok[] generateMoreGroks() { 
    return new Grok[] { 
     new Grok(), new Grok(), new Grok() }; 
} 
+0

Doğru ama foo() çağrısında generateMoreGroks() tarafından döndürülen diziyle birkaç 'yeni Grok()' örneğini karıştıramıyorum. – user291701

İlgili konular