android - java强制类型转换.
PHP中文网
PHP中文网 2017-04-17 17:28:43
0
3
973

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

PHP中文网
PHP中文网

认证0级讲师

모든 응답(3)
巴扎黑

상위 유형의 하위 클래스 및 변수(여전히 상위 클래스 참조라고 함)에 정의된 메서드를 호출할 수 없으면 컴파일 오류가 발생합니다.

객체가 실제로 하위 클래스 객체인 경우(new가 무엇인지 확인) 상위 클래스 참조를 하위 클래스 참조로 캐스팅한 다음 하위 클래스 메서드를 호출할 수 있습니다.

그러나 이 변환은 위험합니다. 이 상위 클래스 참조가 참조하는 개체가 하위 클래스 개체라는 것을 명확하게 알지 않는 한 instanceof을 사용하여 먼저 판단할 수 있습니다. 물론, 스스로 알고 있다면 판단할 필요는 없습니다.

실수로 실수하면 java.lang.ClassCastException(컴파일 시간이 아닌 런타임)

이 발생합니다. 으아아아
巴扎黑

앞으로 심판이 있습니다 if (drawable instanceof AsyncDrawable)

true이면 drawable은 AsyncDrawable이어야 하며 강제 유형 변환에 실패하면 예외가 발생하고 NULL을 반환할 수 없습니다

Peter_Zhu

코드에서 매우 명확하지 않나요? 반환되는 내용은 return asyncDrawable.getBitmapWorkerTask()입니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿