Почему мы всегда печатаем текст в 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);