찾다

 >  Q&A  >  본문

android - java强制类型转换.

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中文网2866일 전989

모든 응답(3)나는 대답할 것이다

  • 巴扎黑

    巴扎黑2017-04-17 17:30:43

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

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

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

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

    이 발생합니다. 으아아아

    회신하다
    0
  • 巴扎黑

    巴扎黑2017-04-17 17:30:43

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

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

    회신하다
    0
  • 天蓬老师

    天蓬老师2017-04-17 17:30:43

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

    회신하다
    0
  • 취소회신하다