2011-01-16 3 views
2

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

например

@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(); 
} 

Будет. Какова фактическая разница?

ответ

5

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

+0

Спасибо. Обычно я использую System.err для отладки моего кода и забыл, что он способен обрабатывать больше, чем просто строки. :) – whirlwin

6

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

8

adapterView не является String.

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

0

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

0

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

0

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

1

также, это

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

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

Смежные вопросы