2014-08-28 3 views
0

У меня есть суперкласс с учеником подкласса. Я создал объект студента типа person и хотел вызвать специальный метод для ученика, который не существует в типе лица. У меня есть два метода ниже, которые могут это сделать, и мне было любопытно узнать, является ли один метод выше другого, или они оба добиваются того же результата?В Java есть предпочтительный метод литья объекта?

Person newStudent = new Student("Scott", 22, "B22334952"); 

    //method1: make a reference of newStudent and cast to Student 
    Student studentRef = (Student) newStudent; 
    System.out.println(studentRef.getUserId()); 

    //method2: cast newStudent, but don't create a reference 
    System.out.println(((Student) student2).getUserId()); 
+2

Оба хороши. Используйте тот, который заставляет вас чувствовать себя комфортно. Если бы я несколько раз использовал 'studentRef', я бы использовал метод 1, если бы использовал его в одном методе LoC, а затем в методе 2. –

+0

Надеюсь, ясно, что они дают одинаковый результат. Что предпочтительнее, полностью зависит от вашего полного использования. Почему у людей нет идентификатора пользователя? Это кажется довольно универсальным. Для этого необходимо сначала проверить тип; не зная точно, что вы делаете, трудно сказать, плохо ли это дизайн или нет. –

+1

Трюк заключается в том, чтобы избежать необходимости бросать его в первую очередь. Но да, оба способа здесь одинаково хороши. –

ответ

3

Они оба получат одинаковый результат.

Создайте переменную, чтобы сохранить результат приведения, если вам нужно повторно использовать ссылку на литу.

Когда вы выполняете бросок, вы настраиваете себя на ClassCastException, поэтому всегда помните. Вы всегда можете проверить тип перед попыткой литья

if (newStudent instanceof Student) { 
    Student studentRef = (Student) newStudent; 
} 
+0

+1 для правильности. Но я бы тоже рекомендовал не писать такой код. –

+0

@AmirAfghani почему бы и нет? Фактически, это вопрос стиля и удобочитаемости. На самом деле, я нахожу этот вид специфического понижения проблемой вообще ... –

+0

@AmirAfghani Вы имеете в виду без кастинга или второй вариант? –

1

Оба схожи.

Используйте второй вариант, если вы больше не хотите использовать эту информацию.

1

Использовать в зависимости от того, что вы предпочитаете, это бессмысленная микро-оптимизация и приведет к эквивалентному байтовому коду. Вы можете также использовать Class.cast(Object) как

System.out.println(Student.class.cast(newStudent).getUserId()); 
+0

Это крутая информация! благодаря –

1

Лучше всего, не отбрасывают. Кастинг означает, что ваш код делает допущения, которые не могут быть проверены во время компиляции, и это рецепт проблемы. Объявите типы переменных, которые фиксируют полные требования и ожидания их значений и полагаются только на те объявленные типы.

Так,

// Declare a Student because a plain Person won't do 
Student newStudent = new Student("Scott", 22, "B22334952"); 

System.out.println(newStudent.getUserId()); 
Смежные вопросы