Java 为什么对传递给泛型方法的参数使用printf(“s”)呢? 包通用方法; 公共类重载方法{ /** *@param args */ 公共静态void main(字符串[]args){ //TODO自动生成的方法存根 整数[]整数数组={1,2,3,4,5}; Double[]doubleArray={1.0,2.0,3.0,4.0,5.0}; 字符[]charArray={'a','b','c','d'}; System.out.println(“A has:”); 打印阵列(整数阵列); System.out.println(“B has:”); 打印阵列(双阵列); System.out.println(“C has:”); 打印阵列(charArray); } 公共静态void printary(T[]数组) { for(T元素:数组) System.out.printf(“%s”,元素);//为什么使用%s而不是其他? System.out.println(); } }

Java 为什么对传递给泛型方法的参数使用printf(“s”)呢? 包通用方法; 公共类重载方法{ /** *@param args */ 公共静态void main(字符串[]args){ //TODO自动生成的方法存根 整数[]整数数组={1,2,3,4,5}; Double[]doubleArray={1.0,2.0,3.0,4.0,5.0}; 字符[]charArray={'a','b','c','d'}; System.out.println(“A has:”); 打印阵列(整数阵列); System.out.println(“B has:”); 打印阵列(双阵列); System.out.println(“C has:”); 打印阵列(charArray); } 公共静态void printary(T[]数组) { for(T元素:数组) System.out.printf(“%s”,元素);//为什么使用%s而不是其他? System.out.println(); } },java,printf,Java,Printf,我的问题是printArray()方法不知道要打印什么类型的数据,并且似乎%d在运行时会出现错误-但%s不是仅用于字符串吗 在对象上调用的方法中使用%s,因此将适用于任何类型T考虑到几乎所有内容都可以转换为字符串,无论是通过toString()方法还是仅仅通过附加基本值 当给出%s时,它会将元素转换为字符串。问题是您不知道“元素”是什么类型。在您的示例中,它可以是整数、双精度或字符。在这种情况下,您不能使用%d或%lf,因为它们不适用于不是整数(对于%d)或双精度(对于%lf)的类型 %s实际上

我的问题是printArray()方法不知道要打印什么类型的数据,并且似乎%d在运行时会出现错误-但%s不是仅用于字符串吗

在对象上调用的方法中使用
%s
,因此将适用于任何类型
T

考虑到几乎所有内容都可以转换为字符串,无论是通过
toString()
方法还是仅仅通过附加基本值


当给出
%s
时,它会将
元素
转换为字符串。

问题是您不知道“元素”是什么类型。在您的示例中,它可以是整数、双精度或字符。在这种情况下,您不能使用%d或%lf,因为它们不适用于不是整数(对于%d)或双精度(对于%lf)的类型


%s实际上适用于所有对象,因为所有对象类型都有一个.toString(),因此它们都可以转换为字符串进行打印。

请参阅。顺便说一下,您正在将
元素
打印为
字符串
。因为您有一个字符串表示任何东西,一个浮点、一个整数、一个字节、一个字符,而其他类型只能表示它们自己。泛型不接受原始值。您仍然可以添加它们,比如说,如果T是Integer的实例,但是您添加的所有整数都将被装箱为一个整数。@不过,这个问题与这个问题有点相切-它是关于格式化程序如何工作的,而不是泛型如何工作的。您当然可以使用
printf
原语(尽管我相信它们会被装箱),问题实际上还是使用了装箱类型。实际上,如果对象实现了
java.util.Formattable
,那么将调用对象的
formatTo
方法。这样就可以将
toString
保留为sebugging,而
printf
format
保留为人用。
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();
    }

}