0

给你:http://developer.android.com/reference/java/io/PrintStream.html#print%28float%29为什么Java PrintStream必须重载其print()函数?

只是一个功能,可以为所有的目的:

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

基元不能为null,也没有'toString()'! –

+0

Ooops好点(Y)这是我的错和错字。但是在函数参数中输入'((Object)an_int)'后,它可以检查null和toString()。 – midnite

+0

基元不是对象。它们不能用作对象。 – MathSquared

回答

5

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

Autoboxing是什么使你能够通过一个初步类型print(Object o)。没有它,PrintStream必须分别为每个基元类型实现重载。

顺便说一句,的print(..)为基本类型的实现更像是:

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

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

+0

“自动装箱”是指铸造'((Object)an_int)'? – midnite

+1

自动装箱意味着当你需要像对象一样对待它们时,像“int”这样的基本类型会自动“封装”在包装对象中。 http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html – Joni

相关问题