cari

Rumah  >  Soal Jawab  >  teks badan

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中文网2838 hari yang lalu975

membalas semua(3)saya akan balas

  • 巴扎黑

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

    Kaedah yang ditakrifkan dalam subkelas dan pembolehubah jenis induk (masih dipanggil rujukan kelas induk) tidak boleh dipanggil Jika dipanggil, ralat kompilasi akan berlaku.

    Jika objek itu sememangnya objek subkelas (lihat yang mana new), anda boleh menghantar rujukan kelas induk kepada rujukan subkelas, dan kemudian anda boleh memanggil kaedah subkelas.

    Tetapi penukaran ini berisiko, melainkan anda tahu dengan jelas bahawa objek yang dirujuk oleh rujukan kelas induk ini ialah objek subkelas, jadi anda boleh menggunakan instanceof untuk menilai terlebih dahulu. Sudah tentu, jika anda mengetahuinya sendiri, anda tidak perlu menilai.

    Jika anda secara tidak sengaja membuat kesilapan, ia akan membuang java.lang.ClassCastException (masa jalan, bukan masa menyusun)

    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();  // 成功
        }
    }
    

    balas
    0
  • 巴扎黑

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

    Ada penghakiman di hadapan if (drawable instanceof AsyncDrawable)

    Memandangkan jika benar, drawable mestilah AsyncDrawable, dan jika penukaran jenis paksa gagal, pengecualian akan dilemparkan dan mustahil untuk mengembalikan NULL

    balas
    0
  • 天蓬老师

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

    Bukankah ia sangat jelas dalam kod? Apa yang dikembalikan ialah: return asyncDrawable.getBitmapWorkerTask();

    balas
    0
  • Batalbalas