2017-08-03 90 views
9

我被困於試圖傳遞一個基元數組(在我的情況下int[])與可變參數的方法。如何傳遞一個原始數組作爲可變參數?

比方說:

// 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 })); 

不過請注意,第一行得到以下警告:

類型的String []的最後一個參數方法的格式(字符串,對象...)並不完全匹配可變參數類型。強制轉換爲Object []以確認非可變參數調用,或傳遞可變參數調用的Object類型的單個參數。也

注意我沒有輸入使用構造的數組,但我從封閉的方法,其簽名我無法改變,就像得到它:

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

注意'String.format'是不是在這裏你的方法。它是一個'java.lang.String'的方法。 – 31piy

+0

你是如何構造'String.format'語句的?它是否包含恆定數量的%s參數?如果是這樣,它也可以包含恆定數量的參數,而不是數組。 – Eran

+0

如果你知道所需要的int的數量,把它們拼寫成:'String.fromat(「%d%d」,ints [0],ints [1])',就像那些'int's將自動複製... –

回答

3

String.format(String format, Object... args)正在等待一個Object可變參數作爲參數。由於int是原始文件,而Integer是java Object,所以您的確應該將int[]轉換爲Integer[]

要做到這一點,你可以使用nedmund答案,如果你是在Java 7中,或與Java 8,可以一條線是:

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

,或者,如果你不需要有一個Integer[],如果Object[]足以讓你的需求,你可以使用:

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

+1

所以基本上你所說的是一個''int''被裝箱到一個''Integer''而一個''int []''沒有被裝箱到一個''Integer []'',所以我有到我自己演員/演員,我是對的嗎? – maxxyme

+1

是的,你有想法 – minioim

+0

解決方案是完美的。但是請注意:''方法格式(String,Object ...)的最後一個參數的類型Integer []與vararg參數類型不完全匹配。強制轉換爲Object []以確認非可變參數調用,或者傳遞可變參數調用的Object類型的各個參數。''' – maxxyme

4

您可以使用包裝類Integer代替,即

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

這是你將如何施展現有int[]陣列:

int[] ints = new int[] { 1, 2 }; 

Integer[] castArray = new Integer[ints.length]; 
for (int i = 0; i < ints.length; i++) { 
    castArray[i] = Integer.valueOf(ints[i]); 
} 

System.out.println(String.format("%s %s", castArray)); 
+0

對不起,但我在Java8中。 – maxxyme