StringBuilder против StringWriter / StringReader

Java всегда будет пытаться использовать наиболее подходящую версию доступного метода (см. JLS §15.12.2 ).

Object, char[] и Integer могут принимать null в качестве действительного значения. Поэтому все 3 версии применимы, поэтому Java придется найти наиболее конкретный.

Поскольку Object является супертипом char[], версия массива более специфична, чем Object -версия. Поэтому, если существуют только эти два метода, будет выбрана версия char[].

Если доступны версии char[] и Integer, то оба они более специфичны, чем Object, но ни один более конкретный, чем другой, поэтому Java не может решить, какой из них вызывать. В этом случае вам придется явно указать, какой из них вы хотите вызвать, отвечая аргумент соответствующему типу.

Обратите внимание, что на практике эта проблема встречается гораздо реже, чем можно было бы подумать. Причиной этого является то, что это происходит только тогда, когда вы явно вызываете метод с null или с переменной довольно неспецифического типа (например, Object).

Напротив , следующий вызов будет совершенно однозначным:

char[] x = null;
doSomething(x);

Хотя вы все еще передаете значение null, Java точно знает, какой метод вызывать, поскольку он учитывает тип переменной .

30
задан Pragmateek 17 July 2014 в 21:14
поделиться

2 ответа

Какое возможное использование StringWriter и StringReader, которое не может сделать сам StringBuilder?

StringReader и StringWriter происходят от TextReader и TextWriter соответственно. Поэтому они могут действовать как экземпляр TextReader или TextWriter, чего не могут string или StringBuilder, поскольку они не являются производными ни от одного из этих типов.

Каково их практическое использование?

Они позволяют вам вызывать API, которые ожидают TextReader или TextWriter, когда то, что вы имеете/хотите, это string или StringBuilder.

В чем может быть причина того, что они принимают на вход не Stream (потому что любой другой писатель и читатель принимает поток как параметр конструктора для работы), а StringBuilder?

Потому что они не работают с потоками; они работают с strings или StringBuilders. Это простые классы-обертки, которые адаптируют эти типы для API, ожидающих другой интерфейс. См: adapter pattern.

34
ответ дан 27 November 2019 в 22:35
поделиться

Я не уверен, кто сказал вам, что их цель заключалась в использовании с StringBuilder, но это абсолютно неверно. Как вы отметили, StringBuilder можно читать и записывать без использования другого класса. Классы StringWriter и StringReader расширяют базовые классы TextReader и TextWriter .Net Framework и предоставляют потоковые функции для работы с текстовыми данными. Например, если вам нужно работать с некоторыми классами типа XmlDocument, некоторые методы позволяют загружать данные Xml через TextReader, поэтому, если у вас есть текст Xml в виде строковой переменной, вы можете загрузить его в StringReader а затем передайте его в XmlDocument.

1
ответ дан 27 November 2019 в 22:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: