【问题标题】:android: ClassCastException when trying to cast Fragmentsandroid:尝试投射片段时出现 ClassCastException
【发布时间】:2016-09-10 23:55:54
【问题描述】:

我正在开发一个应用程序,用户可以在其中创建和编辑自己的测验。我有两个片段,EditQuizFragmentAddQuizFragment,其中一个扩展了另一个:

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。这是什么原因?我认为演员阵容会起作用。

非常感谢任何帮助或建议!


编辑:找到了解决方法。所以我尝试投射的原因是因为我使用的是newInstance pattern for fragments。在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());
    return addQuizFragment;
}

【问题讨论】:

  • 就像所有正方形都是矩形但并非所有矩形都是正方形一样,所有AddQuizFragments 都是EditQuizFragments,但并非相反。您有 new EditQuizFragment(),它不会创建 AddQuizFragment
  • @TavianBarnes 请看我对 Kiskae 回答的回复

标签: java android oop android-fragments casting


【解决方案1】:

AddQuizFragmentEditQuizFragment,但 EditQuizFragment 不是 AddQuizFragment

除非editQuizFragment 是实现AddQuizFragment 的对象,否则您根本无法做到这一点

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-29
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多