我正在嘗試撥打電子郵件String.format()
,電子郵件地址爲String
和Object[]
。我該怎麼做?如何使用params數組調用「vararg」方法?
5
A
回答
14
11
你應該只能夠調用
String text = String.format(formatString, args);
...假設你想要的args
是多值。如果你需要額外的包裝,你必須自己做:
String text = String.format(formatString, new Object[] { args });
基本上,如果參數類型總是匹配參數數組類型,編譯器不會做任何包裝。
從JLS,部分15.12.4.2:
如果M是被調用以KN實際參數表達式,或者,如果m爲正在與K = N實際參數表達式和第k個參數表達式的類型調用不與T []賦值兼容,那麼參數列表(e1,...,en-1,en,... ek)被評估爲好像它被寫爲(e1,...,en-1,新的T [] {en,...,ek})。
請注意開始處的「If」 - 這就是有效地說如果參數已經很好,則不執行包裝。
總之
4
通過例如: (S2和I2有可能通過的可變參數作爲Object[]
最有趣的版本)
PrintStream ps = System.out ;
String[] sarr = new String[] { "a" , "b" } ;
Object os = sarr ;
int[] iarr = new int[] { 1 , 2 } ; // cannot be cast to Object[] - see I6 below
Integer[] ioarr = new Integer[] { 1 , 2 } ; // can be cast to Object[] - see I2 below
Object oi = iarr ; // cannot be cast to Object[] - see I6 below
ps.printf("%n## Strings:%n%n") ;
ps.printf("S1: pass as single objects: %s, %s%n" , "a" , "b") ;
ps.printf("S2: pass as varargs objects: %s, %s%n" , (Object[]) sarr ) ;
ps.printf("S3: pass as single objects: %s, %s%n" , sarr , "c") ;
ps.printf("S4: pass as single objects: %s, %s%n" , os , "c") ;
// ps.printf("S5: MissingFormatArgumentException: %s, %s%n" , os ) ;
// ps.printf("S6: ClassCastException: %s, %s%n" , (Object[]) os ) ;
ps.printf("%n## int:%n%n") ;
ps.printf("I1: pass as single objects: %s, %s%n" , 1 , 2) ;
ps.printf("I2: pass as varargs objects: %s, %s%n" , (Object[]) ioarr) ;
ps.printf("I3: pass as single objects: %s, %s%n" , iarr , 3) ;
ps.printf("I4: pass as single objects: %s, %s%n" , oi , 3) ;
// ps.printf("I5: MissingFormatArgumentException %s, %s%n" , iarr ) ;
// ps.printf("I6: ClassCastException: %s, %s%n" , (Object[]) oi ) ;
輸出:
## Strings:
S1: pass as single objects: a, b
S2: pass as varargs objects: a, b
S3: pass as single objects: [Ljava.lang.String;@ad02649, c
S4: pass as single objects: [Ljava.lang.String;@ad02649, c
## int:
I1: pass as single objects: 1, 2
I2: pass as varargs objects: 1, 2
I3: pass as single objects: [[email protected], 3
I4: pass as single objects: [[email protected], 3
相關問題
- 1. 如何在視圖中使用「params」參數調用方法?
- 2. 如何使用params數組調用var-args成員函數?
- 3. 無法使用方法調用數組?
- 4. 如何使用intent params來驗證調用onActivityResults()方法的調用者?
- 5. 如何用params調用azure函數
- 6. 如何將vararg作爲參數傳遞給方法?
- 7. 如何使用參數調用方法?
- 8. 方法的調用('params'/ generic表兄弟)
- 9. 構造PARAMS與方法調用
- 10. 如何使用方法調用將值分配給數組
- 11. 如何調用使用反射的數組的方法
- 12. 如何使用無對象的數組調用方法?
- 13. 調用數組方法
- 14. Java方法調用數組
- 15. 使用與UIInput組件參數的方法時,如何調用setter方法?
- 16. 可以用params來調用強類型參數的方法嗎?
- 17. 如何驗證多種方法不同PARAMS調用
- 18. 使用方法數組上的索引調用方法
- 19. 如何使用數組的方法
- 20. 如何在數組中使用方法?
- 21. params方法如何工作?
- 22. 如何用params強制使用擴展方法而不是實例方法?
- 23. 如何使用queryString或任何其他方法解析url params
- 24. 如何調用子組件的方法?
- 25. 使用帶有「params」關鍵字且無參數的反射調用方法
- 26. 使用「.order(params [])」與實例方法?
- 27. C#方法,使用params關鍵字
- 28. 如何使用coffeescript和數據屬性生成params數組?
- 29. 在ES6類的數組中使用回調的調用方法
- 30. 使用組件調用父方法
你究竟如何「嘗試」?發生了什麼? – 2010-11-05 16:00:06