Почему ToString () не всегда автоматически не вызывается
-
11-10-2019 - |
Вопрос
Так почему же Тостронг не всегда вызывается? Это пример с использованием API Android.
Например
@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();
}
Так и будет. В чем реальная разница?
Решение
Что вы имеете в виду под всегда? toString()
это просто метод, который возвращает String
представление объекта. А Toast.makeText
ожидает String
параметр, но в первом случае вы даете объект AdapterView
учебный класс. Так что это не компилируется :)
Другие советы
adapterView
не String
.
toString()
Компилятор не вызывает автоматически для выполнения актера, который немного подорвал безопасность типа. Только когда есть +""
Например, компилятор будет автоматически вызовать ToString ().
Единственная ситуация, в которой ToString () вставлен компилятором, находится в конкатенации строки.
Также это
@Override
public void onItemSelected(AdapterView<?> adapterView, View view,
int position, long id) {
Toast.makeText(this, "" + adapterView, Toast.LENGTH_LONG).show();
}
Скомпилируется;)
Я не знаю API Android, но AdapterView на самом деле не является подклассом CHAR -последовательности, поэтому вы должны применять ToString ().
Я полагаю, что второй параметр Toast.maketest имеет тип строки. Затем попытка передать параметр типа AdapterView не будет работать. ToString () никогда не называется автоматически, за исключением случаев, когда сознание строк ("+AdapterView также будет работать, но более уродливо).
Компилятор решает, какой метод требуется от имени метода и числа и типов каждого предоставленного аргумента. В вашем первом примере он ищет метод, называемый maketext, который имеет адаптервью в качестве второго параметра, и не находит ни одного (ваша ошибка компиляции сказала бы вам, что. Во втором примере второй параметр - это строка, а компилятор находит сопоставление Метод. Обратите внимание, что компилятор не может сначала найти метод, а затем сделать параметры подходящими, иначе мы не могли бы перегрузить методы.