Почему Throwable.printStackTrace принимает PrintWriter вместо Writer?

Почему public void printStackTrace(PrintStream s) в классе Throwable взять PrintWriter вместо Writer?

Я думаю, что Writer должен быть нормой (код интерфейса, а не конкретная реализация), но это может быть что-то, что я пропускаю, отсюда и этот вопрос.

2 ответа

Решение

Writer это абстрактный класс, который PrintWriter продолжается. Throwable.printStackTrace занимает PrintWriter потому что это вызывает println метод, который недоступен в Writer учебный класс.println вызывается потому, что нужно напечатать трассировку стека, один кадр стека на строку.

Там может быть несколько причин

  • Первоначальной реализацией было использование PrintStream, а улучшенной версией является PrintWriter.
  • Метод печатает строки текста, и хотя он может создавать PrintWriter по требованию, это не идеально.

То, что они могли бы сделать, это принять 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));
Другие вопросы по тегам