【问题标题】:Casting a datatype in Android在 Android 中转换数据类型
【发布时间】:2010-11-25 04:17:35
【问题描述】:

资源 myResources = getResources();

CharSequence styledText = myResources.getText(R.string.stop_message); 可绘制图标 = myResources.getDrawable(R.drawable.app_icon);

int opaqueBlue = myResources.getColor(R.color.opaque_blue);

float borderWidth = myResources.getDemension(R.dimen.standard_border);

Animation tranout = AnimationUtils.loadAnimation(this, R.anim.spin_shrink_fade);

String{} stringArray = myResources.getStringArray(R.array.string_array);

int[] intArray = myResources.getIntArray(R.array.integer_array);

资源 myResources = getResources(); AnimationDrawable rocket = (AnimationDrawable)myResources.getDrawable (R.drawable.frame_by_frame);

我正在将最后几个语句与前面的语句进行比较。我的问题是,为什么在上面的其他示例中不需要强制转换时,AnimationDrawable 会显式转换?

【问题讨论】:

    标签: android oop inheritance casting


    【解决方案1】:

    因为AnimationDrawable 扩展了Drawable(间接)。

    myResources.getDrawable 返回Drawable 的类型,必须对其进行强制转换才能分配给AnimationDrawable 的类型。

    基本上AnimationDrawableDrawable 的一种间接类型,这意味着Drawable 变量可以指向Drawable 类型及其子类型(包括AnimationDrawable)。这不能反过来工作,例如,您不能将 Drawable 的类型分配给指向 AnimationDrawable 的变量,就像您不能将 Drawable 的类型分配给指向的变量一样LevelListDrawable(另一种类型的Drawable)。

    查看此页面了解更多信息: http://developer.android.com/reference/android/graphics/drawable/DrawableContainer.html

    此页面可获取更多一般信息: http://www.javabeginner.com/learn-java/java-inheritance

    【讨论】:

    • public class HelloAndroid extends Activity { /** 首次创建活动时调用。 */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); O setContentView(R.layout.main);
    • public class HelloAndroid extends Activity { /** 首次创建活动时调用。 /@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);设置内容视图(R.layout.main); /* 我还是一头雾水。那么,如果它扩展了 Activity,为什么你不需要使用 (HelloAndroid).onCreate 来强制转换 onCreate 方法呢? */
    • 你们的逻辑似乎是在派生类中使用源自超类的方法时显式转换。如果是这样,那么源自超级 Activity 类的 onCreate 方法不应具有诸如 public void (HelloAndroid).onCreate (Bundle savedInstanceState); 之类的强制转换
    • 现在不要考虑什么时候使用方法,只要担心基本的多态性。您正在尝试将“Drawable”分配给“AnimationDrawable”变量。由于无法保证您的“Drawable”对象是“AnimationDrawble”,因此您必须强制转换它。
    【解决方案2】:

    因为有很多种类的drawbles,根据你的要求,你会得到不同的类型,所有这些都继承自通用的drawable祖先。除非您只关心泛型 Drawable 方法和成员,否则您必须知道您所要求的类型并将泛型 Drawable 转换为该特定类型。

    【讨论】:

      猜你喜欢
      • 2012-11-09
      • 2014-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      相关资源
      最近更新 更多