【问题标题】:Why use printf("%s") for arguments passed to generic methods?为什么将 printf("%s") 用于传递给泛型方法的参数?
【发布时间】:2013-03-02 19:35:50
【问题描述】:
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 吗?

【问题讨论】:

标签: java printf


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    在对象上调用的toString() 方法中使用%s will result,因此适用于任何类型的T

    【讨论】:

    • 其实如果对象实现了java.util.Formattable,那么就会调用对象的formatTo方法。这样可以保留toString 用于调试,printfformat 供人类使用。
    【解决方案3】:

    请注意,几乎所有内容都可以转换为字符串,无论是通过toString() 方法还是仅通过附加原始值。

    %s 给出时,它会将element 的任何内容转换为字符串。

    【讨论】:

    • 泛型不接受原始值。你仍然可以添加它们,比如如果 T 是 Integer 的实例,但是你添加的所有 int 都将被装箱到一个 Integer。
    • @Legend 不过,这个问题与这个问题有点无关——它是关于 Formatter 的工作原理,而不是泛型的工作原理。你当然可以printf原语(虽然我相信它们会被装箱),而且问题实际上使用了装箱的类型。
    猜你喜欢
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多