2016-09-10 2 views
0

Я разрабатываю приложение, в котором пользователи могут создавать и редактировать свои собственные опросы. У меня есть два фрагмента, EditQuizFragment и AddQuizFragment, один из которых проходит другие:android: ClassCastException при попытке бросить фрагменты

public class EditQuizFragment extends Fragment 
public class AddQuizFragment extends EditQuizFragment 

Я хочу, чтобы бросить AddQuizFragment (подкласс) на качестве EditQuizFragment (суперкласса, который проходит фрагмент).

Когда я пытаюсь запустить следующее, я получаю ClassCastException:

EditQuizFragment editQuizFragment = new EditQuizFragment(); 
AddQuizFragment addQuizFragment = (AddQuizFragment) editQuizFragment; 

Вот сообщение об ошибке:

Caused by: java.lang.ClassCastException: com.quizmaker.fragments.EditQuizFragment cannot be cast to com.quizmaker.fragments.AddQuizFragment 

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

Отметьте, что в EditQuizActivity Я импортировал android.support.v4.app.Fragment. Фактически я использую исключительно фрагмент библиотеки поддержки во всем этом приложении.

Почему я получаю это исключение? Кастинг должен отлично работать, как я понимаю.

Любая помощь или совет приветствуются!


EDIT: Нашли обходной путь. Поэтому я попытался сделать бросок, потому что использовал фрагмент newInstance для фрагментов (http://www.androiddesignpatterns.com/2012/05/using-newinstance-to-instantiate.html). В AddQuizFragment.java я пытался сделать что-то вроде этого:

public static AddQuizFragment newInstance() { 
    return (AddQuizFragment) EditQuizFragment.newInstance(/* arguments here */); 
} 

Это то, что вызывает ClassCastException.

Все newInstance делает (или должен делать) набор аргументов для фрагмента, абстрагируя его от классов с использованием фрагмента. Таким образом, вместо того, чтобы выше, я сделал ниже:

public static AddQuizFragment newInstance() { 
    EditQuizFragment editQuizFragment = EditQuizFragment.newInstance(/* arguments here */); 
    AddQuizFragment addQuizFragment = new AddQuizFragment(); 
    addQuizFragment.setArguments(editQuizFragment.getArguments()); // important line here 
    return addQuizFragment; 
} 
+0

В том же смысле, что все квадраты являются прямоугольниками, но не все прямоугольники являются квадратами, все '' AddQuizFragment's являются EditQuizFragments', но не другой наоборот. У вас есть 'new EditQuizFragment()', который не создает 'AddQuizFragment'. –

+0

@TavianBarnes Пожалуйста, см. Мой ответ на вопрос Kiskae – phitranphitranphitran

ответ

2

AddQuizFragment является EditQuizFragment, но EditQuizFragment не является AddQuizFragment.

Вы просто не можете сделать это, если editQuizFragment не является объектом, который реализует AddQuizFragment

+0

Итак, когда мы делаем что-то вроде этого: 'TextView textView = (TextView) findViewById (R.id.my_text_view)', как получилось? (findViewById возвращает вид, который суперклассы TextView) – phitranphitranphitran

+0

Это наоборот. TextView расширяет представление. TextView - это вид, но не все. Представления - это текстовые объекты. – Bene

+0

@Bene. Итак, что вы предлагаете, так это то, что только суперкласс можно наложить на подкласс? В моем примере TextView подклассы TextView View, но кастинг все еще работает. – phitranphitranphitran

Смежные вопросы