検索

ホームページ  >  に質問  >  本文

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中文网2768日前929

全員に返信(3)返信します

  • 巴扎黑

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

    親型のサブクラスおよび変数で定義されたメソッド (依然として親クラス参照と呼ばれます) を呼び出すと、コンパイル エラーが発生します。

    オブジェクトが実際にサブクラス オブジェクトである場合 (new がどれであるかを参照)、親クラス参照をサブクラス参照にキャストして、サブクラス メソッドを呼び出すことができます。

    ただし、この親クラス参照によって参照されるオブジェクトがサブクラス オブジェクトであることが明確にわかっていない限り、この変換は危険であるため、最初に instanceof を使用して判断できます。もちろん、自分でわかっているのであれば、判断する必要はありません。

    うっかり間違えると、java.lang.ClassCastException (コンパイル時ではなく実行時)

    がスローされます。 リーリー

    返事
    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
  • キャンセル返事