搜尋

首頁  >  問答  >  主體

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中文网2823 天前965

全部回覆(3)我來回復

  • 巴扎黑

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

    子類別中定義的方法,父類型的變數(還是叫父類別引用順口)是不能呼叫的,如果呼叫會引發編譯錯誤。

    如果物件確實是子類別物件(看 new 的是哪個),那可以將父類別引用強制轉換為子類別引用,之後就可以呼叫子類別方法了。 new 的是哪个),那可以将父类引用强制转换为子类引用,之后就可以调用子类方法了。

    但是这种转换是有风险的,除非你清楚的知道这个父类引用所引用的对象是子类对象,所以可以先用 instanceof 来判断。当然,如果你自己清楚,也可以不判断。

    如果不小心搞错了类似,会抛 java.lang.ClassCastException

    但是這種轉換是有風險的,除非你清楚的知道這個父類引用所引用的對像是子類對象,所以可以先用 instanceof 來判斷。當然,如果你自己清楚,也可以不判斷。 🎜 🎜如果不小心搞錯了類似,會拋 java.lang.ClassCastException(執行時,非編譯時)🎜
    class A {
        public void Do1() {
            
        }
    }
    
    class B extends A {
        public void Do2() {
            
        }
    }
    
    public class Test {
        public static void main(String[] args) {
            A a = new B();
            a.Do2();        // 错误: 找不到符号
            ((B) a).Do2();  // 成功
        }
    }
    

    回覆
    0
  • 巴扎黑

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

    前面有判斷 if (drawable instanceof AsyncDrawable)

    既然if為true,drawable 就肯定是 AsyncDrawable,而且強制型別轉換失敗會拋異常,也不可能回傳NULL

    回覆
    0
  • 天蓬老师

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

    程式碼裡面不是很清楚嗎,回傳的是:return asyncDrawable.getBitmapWorkerTask();

    回覆
    0
  • 取消回覆