Почему мы всегда печатаем текст в Android/Java?

Я пишу приложение для Android, и мне было любопытно, почему мы должны всегда вводить текст в Android. Я понимаю, что мы должны быть уверены в типе, чтобы наш код работал правильно, но есть ли, пожалуй, еще одна причина?

Пример:

public class Navigation extends Activity {
    private DrawerLayout mDrawerLayout;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // other irrelevant code
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

В контексте этого вопроса, я спрашиваю, почему мы должны вводить тип возвращаемого значения findViewById. (Мне также интересно, как этот тип кастинга выполняется, если можно это объяснить).

Ответ 1

findViewById загружает ресурсы из файла. Он возвращает какой-то View, но компилятор Java не знает, что это будет DrawerLayout (потому что он определен в файле вне компиляции Java).

Если вам нужно, чтобы он был DrawerLayout в вашем коде, вы должны его бросить. Это гарантирует (во время выполнения), что это действительно такой объект (если это не так, вы получите ClassCastException, и ваша программа будет прервана в этой точке).

Причина, по которой вы хотите использовать ее как DrawerLayout, заключается в том, что вы можете вызвать методы экземпляра, определенные в этом классе. Иногда вы можете быть в порядке с подписью более общего суперкласса. Тогда вам не нужно бросать его.

Конечно, экземпляр, возвращаемый findViewById, является DrawerLayout, независимо от того, выбрали ли вы его или нет. Но если вы его не произнесете, то Java не позволит вам рассматривать его как DrawerLayout. Это точка безопасного типа: если компилятор не может убедиться, что объект имеет определенный класс, он не позволит вам вызывать методы (или поля доступа) для этого класса.

Ответ 2

DrawerLayout является подклассом View. Объект DrawerLayout автоматически имеет все методы, которые имеет View, но определяет некоторые собственные методы, которые относятся к DrawerLayout s. Если вы не используете его, вы не можете использовать ни один из этих методов DrawerLayout; вы можете использовать только методы, определенные для всех View s.

Тип-литье ничего не делает. findViewById объявлен для возврата a View, так как он может возвращать все различные типы View s. Но на самом деле он часто возвращает объект другого класса, то есть подкласс View. Тип-cast просто проверяет, чтобы возвращаемый объект действительно являлся экземпляром DrawerLayout (или одного из его подклассов); если нет, генерируется исключение, но если это так, вы можете теперь просмотреть объект как DrawerLayout и использовать методы DrawerLayout.

Ответ 3

В android - при написании java-кода вам нужно принести XML-код внутри Java.

Итак, мы используем R.id.drawer_layout - это то, что мы хотим ввести внутри java, который становится findViewById(R.id.drawer_layout), который возвращает Object.

Итак, мы назначим его переменной, объявленной сверху.

 private DrawerLayout mDrawerLayout;

где DrawerLayout - это класс в java android.

mDrawerLayout = findViewById(R.id.drawer_layout);

Так как findViewById(R.id.drawer_layout) возвращает объект, и мы назначаем его переменной, нам нужно прибегнуть к типу с помощью

mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);