当前位置: 首页 > 面试题库 >

为什么我们总是在Android / Java中键入强制类型转换?

陈法
2023-03-14
问题内容

我正在编写一个Android应用程序,只是好奇为什么我们必须始终在Android中进行类型转换。我了解我们需要确定类型,以便我们的代码正常运行,但是也许还有其他原因吗?

范例

public class Navigation extends Activity {
    private DrawerLayout mDrawerLayout;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // other irrelevant code
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

在这个问题的上下文中,我问为什么我们必须类型转换findViewById的返回值。(我也很好奇如果可以解释的话,这种类型的转换是如何完成的。)


问题答案:

findViewById从文件加载资源。它返回某种View,但是Java编译器无法知道它将是DrawerLayout(因为它是在Java编译之外的文件中定义的)。

如果您需要将其作为DrawerLayout代码中的a,则必须进行强制转换。这样可以确保(在运行时)它确实是这样的对象(如果不是,则将得到一个,ClassCastException并且程序将在此时中断)。

之所以要强制转换,DrawerLayout是因为您可能想在该类中定义的实例上调用方法。有时,仅使用更通用的超类的签名就可以了。然后,您不必强制转换。

可以肯定的findViewById是,DrawerLayout无论是否强制转换,返回的实例都是无关紧要的。但是,如果您不进行强制转换,那么Java将不允许您将其视为DrawerLayout。这就是类型安全语言的要点:除非编译器可以确定对象属于某个类,否则它不会让您调用该类的方法(或访问字段)。



 类似资料:
  • 问题内容: 我不知道您是否认为这是一个重要问题,但我想知道。float是一个浮点数(4个字节)。double是浮点数(8个字节)。为什么我们定义双重假名铸造: 但是我们需要使用浮点数进行转换: 要么 先感谢您。 问题答案: 如果浮点文字以字母或结束,则其类型为float 。否则,其类型为,并且可以选择以字母或结尾。 浮点类型(和)也可以使用E或e(对于科学记数法),或(32位浮点文字)和或(64位

  • 我有一个父类来处理我所有的自定义异常,父母异常。我希望所有的子异常都有一个方法来向异常添加消息。为了做到这一点,我创建了一个泛型方法,在向其添加消息后返回泛型类型的对象。我在父类方法中使用来添加消息,然后返回,但是由于该方法返回泛型类型,所以我将其转换为泛型类型T。这似乎是可行的,但是给出了警告。我的代码如下: 该行给出的警告是。这种方法似乎确实如预期的那样有效,所以我并不担心,但我想更好地理解为

  • 问题内容: 我有以下两节课: 和: 当我运行测试时,一切都是笨拙的。如果我将类型参数化更改为: 编译器抱怨,报告: 错误:类型不兼容的整数不能转换为T number = new Integer(11); 其中T是类型变量T扩展了在方法getSomeValue(boolean)中声明的Object 它同样对Double有所抱怨。为什么? 编辑:我犯了一个错误。这实际上是有效的代码。 现在我明白了@S

  • 问题内容: 我在一个新项目中将Swift样板代码用于Core Data。我的文件有一个定义的单一实体()和一个属性()。 我有一个看起来像这样的文件: 当我运行它时,它起作用: 我什至可以进入iOS模拟器正在使用的SQLite数据库,并确认已添加该行。 但是,当我运行与上面完全相同的代码,但使用而不是时,出现了与…行关联的错误消息,导致崩溃。如果我继续执行,则每次执行线程1时它都会到达并位于线程1

  • 考虑一个场景,我们有一个泛型方法,它应该能够返回T的空引用,因此T必须是可空的。 有点像这样: CC似乎根本不理解我们试图做什么,它抱怨取消装箱空和方法调用导致“未经证实”的警告。 有没有办法在代码契约中强制执行此约束?

  • 问题内容: JavaScript中的类型强制到底是什么? 例如,使用代替? 问题答案: 类型强制意味着当一个运算符的操作数是不同类型时,其中一个将被转换为另一个操作数类型的“等效”值。例如,如果您这样做: 布尔操作数将被转换为整数:变为,变为1。然后将这两个值进行比较。 但是,如果您使用非转换比较运算符,则不会发生这种转换。当操作数为不同类型时,此运算符将返回,并且仅在它们属于相同类型时才比较这些