2017-08-03 38 views
9

Ben varargs ile bir yönteme (benim durumumda bir int[] olarak) ilkel bir dizi geçiş yapmaya çalışan sıkıştım.Varargs olarak bir dizi ilkel nasıl geçilir?

Diyelim ki:

// prints: 1 2 
    System.out.println(String.format("%s %s", new String[] { "1", "2"})); 
    // fails with java.util.MissingFormatArgumentException: Format specifier '%s' 
    System.out.println(String.format("%s %s", new int[] { 1, 2 })); 

Not Ancak ilk satırı aşağıdaki uyarıyı aldığını:

Tipi String [] yöntem biçimine son argüman (String, Object ...) tam olarak vararg parametre türüyle eşleşmiyor. Varargs çağrısını onaylamak için Nesne [] 'ye yayınlayın veya varargs çağırma için Object türündeki bağımsız argümanları iletin.

Not da ben girişi bir kurucu ile dizi yapmak, ama kimin imzası ben değiştiremem, gibi kapsayan yöntemi onu alıyorum:

private String myFormat(int[] ints) { 
    // whatever format it is, it's just an example, assuming the number of ints 
    // is greater than the number of the format specifiers 
    return String.format("%s %s %s %s", ints); 
} 
+1

not. Onun java.lang.String' bir nethod. – 31piy

+0

'String.format' ifadesini nasıl oluşturuyorsunuz? Sabit sayıda% s parametresi içeriyor mu? Eğer öyleyse, bir dizi yerine sabit sayıda parametre de içerebilir. Gerekli 'int's sayısını bilmek ise – Eran

+0

gibi, onları yazım: 'String.fromat (int "% d% d"[0], int [1])', o 'int's olarak autoboxed olacak ... –

cevap

3

String.format(String format, Object... args), Object varargs parametresini parametre olarak bekliyor. int ilkel olduğundan, Integer java Object iken, int[]Integer[]'a dönüştürmeniz gerekir.

bunu yapmak için, Java 8 ile, Java 7 ise nedmund cevabı kullanabilir veya yapabilirsiniz bir çizgisi:

Integer[] what = Arrays.stream(data).boxed().toArray(Integer[]::new);

ya, sen olması gerekir yoksa bir Object[] ihtiyacı için yeterli olup olmadığını bir Integer[], şunları kullanabilirsiniz: String.format` burada yöntem değildir `o

Object[] what = Arrays.stream(data).boxed().toArray();

+1

Yani temelde sizin demek bir '' [] '' Bir '' Tamsayı [] '' kutulu değildir int sırasında bir '' int'' bir '' Integer'' için kutulu olmasıdır, bu yüzden var benimle/dönüştürme ile doğru muyum? – maxxyme

+1

Evet, fikrin var – minioim

+0

Çözüm mükemmel. Ancak yine de bir uyarı olduğuna dikkat edin: '' Son biçim argümanının metod formatı için (Tamsayı, Nesne ...) Tamsayı [], tam olarak vararg parametre türüyle eşleşmiyor. Varargs çağrısını onaylamak için [] nesnesine yayınla veya bir varargs çağrısı için Object türünün bağımsız değişkenlerini ilet. '' – maxxyme

4

Sen kapsayıcı kullanabilir

:

System.out.println(String.format("%s %s", new Integer[] { 1, 2 })); 

yani yerine sınıf Integer Bu varolan int[] dizi döküm şekli şöyledir

+0

Üzgünüm, ama Java8'deyim. – maxxyme

İlgili konular