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

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

répondre à tous(3)
巴扎黑

Les méthodes définies dans les sous-classes et les variables du type parent (encore appelées références de classe parent) ne peuvent pas être appelées. Si elles sont appelées, une erreur de compilation se produira.

Si l'objet est effectivement un objet de sous-classe (voir lequel new est), vous pouvez convertir la référence de classe parent en une référence de sous-classe, puis vous pouvez appeler la méthode de sous-classe.

Mais cette conversion est risquée, à moins que vous ne sachiez clairement que l'objet référencé par cette référence de classe parent est un objet de sous-classe, vous pouvez donc utiliser instanceof pour juger en premier. Bien sûr, si vous le savez vous-même, vous n’avez pas à juger.

Si vous faites accidentellement une erreur, cela lancera java.lang.ClassCastException (temps d'exécution, pas temps de compilation)

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

Il y a un jugement à venir if (drawable instanceof AsyncDrawable)

Puisque si c'est vrai, drawable doit être AsyncDrawable, et si la conversion de type forcée échoue, une exception sera levée et il est impossible de renvoyer NULL

Peter_Zhu

N'est-ce pas très clair dans le code ? Ce qui est renvoyé est : return asyncDrawable.getBitmapWorkerTask();

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal