为什么Java PrintStream必须重载其print()函数?

时间:2013-04-02 22:16:39

标签: java object overloading printstream

你在这里:http://developer.android.com/reference/java/io/PrintStream.html#print%28float%29

只有一个功能可以满足所有目的:

public void print (Object o) {
    if (o == null) {
        // print "null"
    } else {
        // print o.toString();
    }
}

更详细说明。例如,internal_print(String str)是写入打印流的函数。那么唯一需要的功能就是:

public void print (Object o) {
    if (o == null) {
        internal_print( "null" );
    } else {
        internal_print( o.toString() );
    }
}

对于其他floatintcharlong等超载,我可以想象它们就像:

public void print (float o) {
    if (o == null) {
        internal_print( "null" );
    } else {
        internal_print( o.toString() );
    }
}

public void print (int o) {
    if (o == null) {
        internal_print( "null" );
    } else {
        internal_print( o.toString() );
    }
}

public void print (char o) {
    if (o == null) {
        internal_print( "null" );
    } else {
        internal_print( o.toString() );
    }
}

public void print (long o) {
    if (o == null) {
        internal_print( "null" );
    } else {
        internal_print( o.toString() );
    }
}

...

甚至只是调用杀手函数print (Object o)

你可以解释一下吗?非常感谢!!

1 个答案:

答案 0 :(得分:5)

历史原因:PrintStream类自Java 1.0以来就存在,早在添加自动装箱之前(1.5)。

通过自动装箱可以将普通话类型传递给print(Object o)。没有它PrintStream必须分别为每个基本类型实现重载。

顺便说一下,print(..)对原始类型的实现更像是:

public void print (int o) {
    print(String.valueOf(o));
}

... String.valueOf(..)的实现基本上委托给包装类中的方法,例如Integer.toString(int)Long.toString(long)。您可以在docjar阅读源代码。