私はユーザーが独自のクイズを作成して編集できるアプリケーションを開発しています。android:ClassCastExceptionがフラグメントをキャストしようとしています
public class EditQuizFragment extends Fragment
public class AddQuizFragment extends EditQuizFragment
私はEditQuizFragment
(フラグメントを拡張するスーパークラス)にAddQuizFragment
(サブクラス)をキャストしたい:私は他を拡張そのうちの一つ二つの断片、EditQuizFragment
とAddQuizFragment
を、持っています。
私は次のことを実行しようとすると、私はClassCastException
を得る:
Caused by: java.lang.ClassCastException: com.quizmaker.fragments.EditQuizFragment cannot be cast to com.quizmaker.fragments.AddQuizFragment
私は他のクラスに、エラーの原因となるコードを移動しようとしました、:
EditQuizFragment editQuizFragment = new EditQuizFragment();
AddQuizFragment addQuizFragment = (AddQuizFragment) editQuizFragment;
ここでエラーメッセージがありますファイルなどがありますが、それでも同じClassCastException
が得られます。
には、android.support.v4.app.Fragment
をインポートしました。私は実際に排他的にサポートライブラリのフラグメントをこのアプリケーション全体で使用します。
なぜこの例外が発生しますか?クラスのキャスティングは私が理解しているところからうまく動作するはずです。
ご不明な点がありましたら、お気軽にお問い合わせください。
EDIT:は、回避策を見つけました。だから、私がフラグメントのnewInstanceパターン(http://www.androiddesignpatterns.com/2012/05/using-newinstance-to-instantiate.html)を使っていたので、キャストしようとしていた理由です。
public static AddQuizFragment newInstance() {
return (AddQuizFragment) EditQuizFragment.newInstance(/* arguments here */);
}
これは、ClassCastExceptionが引き起こしたものである。AddQuizFragment.javaで私はこのような何かをしようとしていました。
すべてのnewInstanceは、フラグメントを使用するクラスから引数を取り除いて、そのフラグメントの引数バンドルを設定します。だからではなく、上記の、私は以下でした:
public static AddQuizFragment newInstance() {
EditQuizFragment editQuizFragment = EditQuizFragment.newInstance(/* arguments here */);
AddQuizFragment addQuizFragment = new AddQuizFragment();
addQuizFragment.setArguments(editQuizFragment.getArguments()); // important line here
return addQuizFragment;
}
を実装したオブジェクトでない限り、あなたは、単にこれを行うことはできません道の周りに。あなたは 'AddQuizFragment'を作成しない'新しいEditQuizFragment() 'を持っています。 –
@TavianBarnes Kiskaeの回答 – phitranphitranphitran