android training
中的bitmap
讲解中有这么一段代码
static class AsyncDrawable extends BitmapDrawable {
private final WeakReference<BitmapWorkerTask> bitmapWorkerTaskReference;
public AsyncDrawable(Resources res, Bitmap bitmap,
BitmapWorkerTask bitmapWorkerTask) {
super(res, bitmap);
bitmapWorkerTaskReference =
new WeakReference<BitmapWorkerTask>(bitmapWorkerTask);
}
public BitmapWorkerTask getBitmapWorkerTask() {
return bitmapWorkerTaskReference.get();
}
}
----------------------
private static BitmapWorkerTask getBitmapWorkerTask(ImageView imageView) {
if (imageView != null) {
final Drawable drawable = imageView.getDrawable();
if (drawable instanceof AsyncDrawable) {
final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable;
return asyncDrawable.getBitmapWorkerTask();
}
}
return null;
}
这里的drawable
强制转换为AsyncDrawable
,为什么这里的父类转换为子类asyncDrawable.getBitmapWorkerTask()
不是返回null
。
Les méthodes définies dans les sous-classes et les variables du type parent (encore appelées références de classe parent) ne peuvent pas être appelées. Si elles sont appelées, une erreur de compilation se produira.
Si l'objet est effectivement un objet de sous-classe (voir lequel
new
est), vous pouvez convertir la référence de classe parent en une référence de sous-classe, puis vous pouvez appeler la méthode de sous-classe.Mais cette conversion est risquée, à moins que vous ne sachiez clairement que l'objet référencé par cette référence de classe parent est un objet de sous-classe, vous pouvez donc utiliser
instanceof
pour juger en premier. Bien sûr, si vous le savez vous-même, vous n’avez pas à juger.Si vous faites accidentellement une erreur, cela lancera
java.lang.ClassCastException
(temps d'exécution, pas temps de compilation)Il y a un jugement à venir
if (drawable instanceof AsyncDrawable)
Puisque si c'est vrai, drawable doit être AsyncDrawable, et si la conversion de type forcée échoue, une exception sera levée et il est impossible de renvoyer NULL
N'est-ce pas très clair dans le code ? Ce qui est renvoyé est : return asyncDrawable.getBitmapWorkerTask();