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

mid*_*ite 0 java overloading object 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public void print (Object o) {
    if (o == null) {
        internal_print( "null" );
    } else {
        internal_print( o.toString() );
    }
}
Run Code Online (Sandbox Code Playgroud)

对于其他float,int,char,long,等超载,我能想象他们只是喜欢:

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() );
    }
}

...
Run Code Online (Sandbox Code Playgroud)

甚至只是调用杀手功能print (Object o).

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

Jon*_*oni 5

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

自动装箱是使你能够传递一个原始类型的原因print(Object o).没有它PrintStream必须分别为每个基本类型实现重载.

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

public void print (int o) {
    print(String.valueOf(o));
}
Run Code Online (Sandbox Code Playgroud)

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