2016-09-10 6 views
0

私はユーザーが独自のクイズを作成して編集できるアプリケーションを開発しています。android:ClassCastExceptionがフラグメントをキャストしようとしています

public class EditQuizFragment extends Fragment 
public class AddQuizFragment extends EditQuizFragment 

私はEditQuizFragment(フラグメントを拡張するスーパークラス)にAddQuizFragment(サブクラス)をキャストしたい:私は他を拡張そのうちの一つ二つの断片、EditQuizFragmentAddQuizFragmentを、持っています。

私は次のことを実行しようとすると、私は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; 
} 
+0

を実装したオブジェクトでない限り、あなたは、単にこれを行うことはできません道の周りに。あなたは 'AddQuizFragment'を作成しない'新しいEditQuizFragment() 'を持っています。 –

+0

@TavianBarnes Kiskaeの回答 – phitranphitranphitran

答えて

2

AddQuizFragmentEditQuizFragmentですが、EditQuizFragmentAddQuizFragmentではありません。

、すべての `AddQuizFragment`sは` EditQuizFragments`であるが、他のではないeditQuizFragmentは、すべての正方形が長方形ではなく、すべての長方形は正方形であることと同じ意味でAddQuizFragment

+0

への私の返事を見てください。このようなことをしたら: 'TextView textView =(TextView)findViewById(R.id.my_text_view)'、どうしたらうまくいくのですか? (findViewByIdは、TextViewのスーパークラスであるビューを返します) – phitranphitranphitran

+0

これは逆です。 TextViewはViewを拡張します。 TextViewはビューですが、すべてのビューがTextViewsではありません – Bene

+0

@Beneそれで、スーパークラスだけをサブクラスにキャストすることができますか?私のTextViewの例では、TextViewのサブクラスのViewでは、まだキャストは機能しています。 – phitranphitranphitran

関連する問題