私は奇妙な行動をとっています、そして私は解決策よりも説明を探していると思います(解決策も歓迎されますが!)。
コードは次のとおりです。
PackageManager pm = context.getPackageManager();
List<PackageInfo> pkgList = pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
if (pkgList == null)
return null;
for (PackageInfo pkgInfo : pkgList) {
ApplicationInfo appInfo = pkgInfo.applicationInfo;
// do some stuff, doesn't modify pkgInfo or appInfo or pkgList
}
また、場合によっては、次のエラーログが表示されます。
java.lang.ClassCastException:android.content.pm.PackageInfoにキャストできません
行について報告:
for (PackageInfo pkgInfo : pkgList)
奇妙な部分は、通常、ClassCastException
通常は(AFAIK)のように見えることです。
java.lang.ClassCastException:foo.bar.ClassAをfoo.bar.ClassBにキャストできません
しかし、私が見ているエラーは、最初の部分が空白になっていることを示しています。
私は少し調べて、リストを返す関数が内部で間違ったオブジェクトリストをキャストし、それなどを返した場合に発生する可能性があることを読みました。だから私は見た:
ApplicationPackageManager.getInstalledPackages()
@SuppressWarnings("unchecked")
@Override
public List<PackageInfo> getInstalledPackages(int flags) {
try {
final List<PackageInfo> packageInfos = new ArrayList<PackageInfo>();
PackageInfo lastItem = null;
ParceledListSlice<PackageInfo> slice;
do {
final String lastKey = lastItem != null ? lastItem.packageName : null;
slice = mPM.getInstalledPackages(flags, lastKey);
lastItem = slice.populateList(packageInfos, PackageInfo.CREATOR);
} while (!slice.isLastSlice());
return packageInfos;
} catch (RemoteException e) {
throw new RuntimeException("Package manager has died", e);
}
}
さて、返されるリストはから入力されますParceledListSlice.populateList()...
ParceledListSlice.populateList()
public T populateList(List<T> list, Creator<T> creator) {
mParcel.setDataPosition(0);
T item = null;
for (int i = 0; i < mNumItems; i++) {
item = creator.createFromParcel(mParcel);
list.add(item);
}
mParcel.recycle();
mParcel = null;
return item;
}
したがって、アイテムはから作成されていPackageInfo.CREATOR.createFromParcel()
ます...
そして最後creator.createFromParcel
にPackageInfo
public static final Parcelable.Creator<PackageInfo> CREATOR
= new Parcelable.Creator<PackageInfo>() {
public PackageInfo createFromParcel(Parcel source) {
return new PackageInfo(source);
}
public PackageInfo[] newArray(int size) {
return new PackageInfo[size];
}
};
だから、すべてが大丈夫のようです。ParceledListSlice
タイプのを作成しているPackageInfo
のでpopulateList
、アイテムを作成して、返されたリストであるのにPackageInfo
入れます。すべてのタイプ/クラスは私には問題ないようです。List
PackageInfo
だから私の質問、
- 上記のClassCastExceptionはどのように発生しますか?
- エラーメッセージに「空白」タイプが表示されるのはなぜですか?
- そして、可能な解決策は何でしょうか?
リストをリストにObject
して「」をチェックするinstanceof
ことを考えていたのですが、おそらく「」と言ってしまうので、それもうまくいくとは思いません。
ClassCastException:java.lang.Object"などにキャストできません。
これがどのように発生するかについての洞察と説明をいただければ幸いです。
- Dalvik / JVMは単に混乱していますか?
- メモリが破損していますか?
私は野生の推測しか思いつかなかった=)