Почему ToString () не всегда автоматически не вызывается

StackOverflow https://stackoverflow.com/questions/4705624

Вопрос

Так почему же Тостронг не всегда вызывается? Это пример с использованием 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, который имеет адаптервью в качестве второго параметра, и не находит ни одного (ваша ошибка компиляции сказала бы вам, что. Во втором примере второй параметр - это строка, а компилятор находит сопоставление Метод. Обратите внимание, что компилятор не может сначала найти метод, а затем сделать параметры подходящими, иначе мы не могли бы перегрузить методы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top