2013-03-02 71 views
4
package genericMethods; 

public class OverloadedMethods { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     Integer[] integerArray = {1, 2, 3, 4, 5}; 
     Double[] doubleArray = {1.0, 2.0, 3.0, 4.0, 5.0}; 
     Character[] charArray = {'a', 'b', 'c', 'd'}; 

     System.out.println("A has: "); 
     printArray(integerArray); 
     System.out.println("B has: "); 
     printArray(doubleArray); 
     System.out.println("C has: "); 
     printArray(charArray); 
    } 

    public static <T> void printArray(T[] array) 
    { 
     for(T element : array) 
      System.out.printf("%s ", element);//why use %s instead of others? 

     System.out.println(); 
    } 

} 

我的問題是方法printArray()不知道要打印出什麼類型的數據,並且似乎%d在運行時會發生錯誤 - 但不是%s僅適用於String?爲什麼使用printf(「%s」)傳遞給泛型方法的參數?

+3

請參考http://docs.oracle.com/javase/6/docs/api/java/util/Formatter.html。順便說一句,您將'element'打印爲'String'。 – 2013-03-02 19:36:42

+1

因爲你有一個字符串表示任何東西,一個浮點數,一個整數,一個字節,一個字符,而其他類型只能表示自己。 – 2013-03-02 19:38:13

回答

15

的問題是,你不知道什麼類型的「元素」會。在你的例子中,它可以是Integer,Double或Character。既然如此,你不能使用%d或%lf,因爲那些不適用於不是Integer(對於%d)或Double(對於%lf)的類型。

%s的實際工作爲他們所有,因爲所有的對象類型都有一個的ToString(),所以他們都可以轉換爲字符串進行打印。

+0

非常詳細的答案,謝謝! – Twocode 2013-03-02 19:49:02

6

使用%swill result中的toString()方法被調用的對象,因此將適用於任何類型的T

+0

非常整潔的答案,謝謝你的參考! – Twocode 2013-03-02 19:50:06

+0

實際上,如果對象實現了'java.util.Formattable',那麼該對象的'formatTo'方法將被調用。這樣可以保留'toString'用於sebugging,'printf'或'format'用於人類使用。 – 2013-10-17 13:09:53

2

考慮有分,幾乎一切都可以變成一個字符串,由toString()方法或者通過附加的原始值吧。

當給出%s時,它會將任何element都變成一個String。

+0

原型值不適用於仿製藥。你仍然可以添加它們,比如說T是Integer的實例,但是你添加的所有整數都會被裝箱到Integer。 – 2013-03-02 19:41:05

+1

@Legend雖然這個問題與這個問題有點相似 - 它是關於'Formatter'如何工作,而不是關於泛型如何工作。你當然可以使用'printf'原語(儘管我相信它們會被裝箱),而且這個問題實際上使用了盒裝類型。 – millimoose 2013-03-02 19:42:49

相關問題