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
。
상위 유형의 하위 클래스 및 변수(여전히 상위 클래스 참조라고 함)에 정의된 메서드를 호출할 수 없으면 컴파일 오류가 발생합니다.
객체가 실제로 하위 클래스 객체인 경우(
new
가 무엇인지 확인) 상위 클래스 참조를 하위 클래스 참조로 캐스팅한 다음 하위 클래스 메서드를 호출할 수 있습니다.그러나 이 변환은 위험합니다. 이 상위 클래스 참조가 참조하는 개체가 하위 클래스 개체라는 것을 명확하게 알지 않는 한
instanceof
을 사용하여 먼저 판단할 수 있습니다. 물론, 스스로 알고 있다면 판단할 필요는 없습니다.실수로 실수하면
이 발생합니다. 으아아아java.lang.ClassCastException
(컴파일 시간이 아닌 런타임)앞으로 심판이 있습니다
if (drawable instanceof AsyncDrawable)
true이면 drawable은 AsyncDrawable이어야 하며 강제 유형 변환에 실패하면 예외가 발생하고 NULL을 반환할 수 없습니다
코드에서 매우 명확하지 않나요? 반환되는 내용은 return asyncDrawable.getBitmapWorkerTask()입니다.