为了账号安全,请及时绑定邮箱和手机立即绑定

java强制类型转换.

java强制类型转换.

慕码人2483693 2019-03-21 22:19:03
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。
查看完整描述

3 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

子类中定义的方法,父类型的变量(还是叫父类引用顺口)是不能调用的,如果调用会引发编译错误。

如果对象确实是子类对象(看 new 的是哪个),那可以将父类引用强制转换为子类引用,之后就可以调用子类方法了。

但是这种转换是有风险的,除非你清楚的知道这个父类引用所引用的对象是子类对象,所以可以先用 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();  // 成功

    }

}


查看完整回答
反对 回复 2019-04-17
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

前面有判断 if (drawable instanceof AsyncDrawable)

既然if为true,drawable 就肯定是 AsyncDrawable,而且强制类型转换失败会抛异常,也不可能返回NULL


查看完整回答
反对 回复 2019-04-17
?
jeck猫

TA贡献1909条经验 获得超7个赞

代码里不是很清楚吗,返回的是:return asyncDrawable.getBitmapWorkerTask();


查看完整回答
反对 回复 2019-04-17
  • 3 回答
  • 0 关注
  • 500 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信