为什么我们总是在Android / Java中输入类型?

时间:2015-05-25 01:29:27

标签: java android

我正在编写一个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的返回值。 (我也很好奇如果可以解释这种类型的铸造方法。)

3 个答案:

答案 0 :(得分:11)

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

如果您需要在代码中使用DrawerLayout,则必须进行投射。 这确保(在运行时)它确实是这样一个对象(如果不是,你会得到一个ClassCastException,你的程序将在那时中止)。

您希望将其强制转换为DrawerLayout的原因是您可能希望调用该类中定义的实例上的方法。有时,你可能只使用更一般的超类的签名。那你就不必投了它。

可以肯定的是,无论你是否投射,findViewById返回的实例都是DrawerLayout。但如果你没有投出它,那么Java不会让你把它当成DrawerLayout。这是类型安全语言的要点:除非编译器能够确定某个对象属于某个类,否则它不会让您调用该类的方法(或访问字段)。

答案 1 :(得分:1)

DrawerLayoutView的子类。 DrawerLayout对象自动拥有View具有的所有方法,但定义了一些特定于DrawerLayout的方法。如果你没有投射它,你就不能使用任何DrawerLayout方法;您只能使用为所有View s。

定义的方法

类型转换并没有做任何事情。声明findViewById会返回View,因为它可以返回所有不同类型的View。但实际上,它通常会返回其他类的对象,即View的子类。类型转换只是检查以确保返回的对象实际上是DrawerLayout(或其子类之一)的实例;如果没有,则抛出异常,但如果是,则现在可以将对象视为DrawerLayout并使用DrawerLayout方法。

答案 2 :(得分:-1)

在android中 - 编写java代码时,需要在Java中引入XML代码。

所以我们使用R.id.drawer_layout是我们想要带入java里面的东西 findViewById(R.id.drawer_layout),返回Object

然后我们将它分配给在顶部声明的变量。

 private DrawerLayout mDrawerLayout;

其中DrawerLayout是java android中的一个类。

mDrawerLayout = findViewById(R.id.drawer_layout);

由于findViewById(R.id.drawer_layout)返回一个对象并且我们将它分配给一个变量,我们需要使用

进行类型转换
mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);