Почему toString () не всегда вызывается автоматически - PullRequest
2 голосов
/ 16 января 2011

Так почему же toString не вызывается всегда? Это пример использования Android API.

* 1003 например *

@Override
public void onItemSelected(AdapterView<?> adapterView, View view,
        int position, long id) {
    Toast.makeText(this, adapterView, Toast.LENGTH_LONG).show();
}

Не компилируется. Однако, если я изменю его на

@Override
public void onItemSelected(AdapterView<?> adapterView, View view,
            int position, long id) {
    Toast.makeText(this, adapterView.toString(), Toast.LENGTH_LONG).show();
}

Будет. Какова реальная разница?

Ответы [ 7 ]

8 голосов
/ 16 января 2011

adapterView не String.

toString() не вызывается компилятором автоматически для выполнения приведения - это немного подорвет безопасность типов.Например, только когда есть +"", компилятор автоматически вызывает toString ().

6 голосов
/ 16 января 2011

Единственная ситуация, когда toString () вставляется компилятором, заключается в конкатенации строк.

5 голосов
/ 16 января 2011

Что вы подразумеваете под всегда? toString() - это просто метод, который возвращает String представление объекта. Toast.makeText ожидает параметр String, но в первом случае вы даете объект класса AdapterView. Так что он не скомпилируется:)

1 голос
/ 16 января 2011

также, это

@Override
public void onItemSelected(AdapterView<?> adapterView, View view,
            int position, long id) {
    Toast.makeText(this, "" + adapterView, Toast.LENGTH_LONG).show();
}

скомпилирует;)

0 голосов
/ 16 января 2011

Компилятор решает, какой метод требуется, исходя из имени метода, а также количества и типов каждого предоставленного аргумента.В вашем первом примере он ищет метод с именем makeText, который имеет AdapterView в качестве второго параметра, и не находит ни одного (ваша ошибка компиляции сказала бы вам об этом. Во втором примере второй параметр является String, и компилятор находит соответствующийОбратите внимание, что компилятор не может сначала найти метод, а затем привести параметры в соответствие, иначе у нас не может быть перегруженных методов.

0 голосов
/ 16 января 2011

Полагаю, второй параметр Toast.makeTest имеет тип String.Тогда попытка передать параметр типа AdapterView не будет работать.toString () никогда не вызывается автоматически, за исключением случаев объединения строк ("" + adapterView также будет работать, но более уродливо).

0 голосов
/ 16 января 2011

Я не знаю Android API, но AdapterView на самом деле не является подклассом CharSequence, поэтому вы должны применить toString ().

...