4

以下のコードスニペットでは、1行目と2行目が正常で、3行目がコンパイルエラーを引き起こすのはなぜですか?最初の2行は機能的に3行目と同等ではありませんか?

Loader loader = getLoaderManager().getLoader(0);
PatientLoader patientLoader = (PatientLoader) loader;
patientLoader = (PatientLoader) getLoaderManager().getLoader(0); // ERROR!

これを投げます:

java: somepath/Patient.java:99: inconvertible types
found   : android.content.Loader<java.lang.Object>
required: com.example.package.PatientLoader

PatientLoader間接的に拡張しLoader<>ます。

私はC#のバックグラウンドを持っていますが、C#ではこれは問題にならないので、Java型システムについて何かが足りないかもしれません。

PatientLoader拡張しAsyncTaskLoader<Cursor>ます。そして、Android SDKに精通している人なら誰でも、AsyncTaskLoader<>extendsを知っているでしょうLoader<>

4

1 に答える 1

8

括弧の配置とは何の関係もありません。この問題はジェネリックと関係があります:

例:コンパイルの失敗:

Loader<Object> loader = getLoaderManager().getLoader(0);
PatientLoader ch = (PatientLoader)loader; // Will show compile error (Cannot cast from Loader<Object> to PatienLoader)

しかし、これはうまくコンパイルされます:

Loader<?> loader = getLoaderManager().getLoader(0);
PatientLoader ch = (PatientLoader)loader; // Compiles fine.

違いは、<Object>ジェネリックと<?>ジェネリック宣言です。

問題は、getLoader(int)がLoader<D>を返すように定義されていることです。これは、以下のステートメントの「getLoaderManager()。getLoader()」が、Loader <?>ではなくLoader<Object>として解釈されることを意味します。

PatientLoader ch = (PatientLoader)getLoaderManager().getLoader(0); // Compile error.

これはSDKの「バグ」だと思います。getLoader(int)メソッドは、Loader<D>ではなくLoader<?>を返すように定義されている必要があります。

于 2013-02-06T18:18:07.807 に答える