爲什麼public void printStackTrace(PrintStream s)
在Throwable類中使用PrintWriter而不是Writer?爲什麼Throwable.printStackTrace需要PrintWriter而不是Writer?
我認爲作家應該是規範(代碼接口,而不是具體的實現),但它可能是我失蹤的東西,因此這個問題。
爲什麼public void printStackTrace(PrintStream s)
在Throwable類中使用PrintWriter而不是Writer?爲什麼Throwable.printStackTrace需要PrintWriter而不是Writer?
我認爲作家應該是規範(代碼接口,而不是具體的實現),但它可能是我失蹤的東西,因此這個問題。
Writer
是PrintWriter
擴展的抽象類。 Throwable.printStackTrace
需要PrintWriter
,因爲它調用了println
方法,該方法在Writer
類中不可用。調用println
是因爲它需要打印堆棧跟蹤,每行一個堆棧幀。
謝謝@Abhinav:這是有道理的。這就是說,而不是有一個包裝類,它將所有糖的功能(如println)直接寫入Writer將是非常好的。這可以最小化層次結構,簡化使用情況,並保存一個額外的對象:-)。 – daniel
可能有幾個原因
他們可以做的是接受一個Appendable,它是Writer的父母。
public void printStackTrace(Appendable appendable) {
PrintWriter pw = (appendable instanceof PrintWriter) ? (PrintWriter) appendable :
(appendable instanceof Writer) ? new PrintWriter((Writer) appendable) :
new printWriter(new AppendableWriter(appendable));
Writer不是接口,它是一個抽象類:http://docs.oracle.com/javase/7/docs/api/java/io/Writer.html – joergl
Appendable是由Writer實現的接口。 –
@joergl:你說得對。我的意思是設計意義上的「界面」,它也涵蓋(某些)抽象類。 – daniel