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

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级讲师

membalas semua(3)
巴扎黑

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

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

Peter_Zhu

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan