Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我们总是在Android/Java中输入cast?_Java_Android - Fatal编程技术网

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

为什么我们总是在Android/Java中输入cast?,java,android,Java,Android,我正在写一个Android应用程序,只是好奇为什么我们必须在Android中输入cast。我理解,我们需要确定类型,以便代码正常运行,但可能还有其他原因吗 示例: public class Navigation extends Activity { private DrawerLayout mDrawerLayout; @Override public void onCreate(Bundle savedInstanceState) { // other

我正在写一个Android应用程序,只是好奇为什么我们必须在Android中输入cast。我理解,我们需要确定类型,以便代码正常运行,但可能还有其他原因吗

示例

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的返回值。(如果可以解释的话,我也很好奇这种类型转换是如何完成的。)

DrawerLayout
视图的子类。
DrawerLayout
对象自动拥有
视图所拥有的所有方法,但定义了自己特定于
DrawerLayout
的一些方法。如果不强制转换,则不能使用任何
DrawerLayout
方法;您只能使用为所有视图定义的方法


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

findViewById
从文件加载资源。它返回某种类型的
视图
,但Java编译器无法知道它将是
抽屉布局
(因为它是在Java编译之外的文件中定义的)

如果您需要它成为代码中的
DrawerLayout
,则必须强制转换它。 这确保(在运行时)它确实是这样一个对象(如果不是,您将得到一个
ClassCastException
,并且您的程序将在该点中止)

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


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

在android中-编写java代码时,您需要将XML代码带到java中

所以我们使用
R.id.drawer\u布局
是我们想要在java中引入的
findViewById(R.id.drawer\u布局)
返回一个
对象

然后我们把它分配给一个在顶部声明的变量

 private DrawerLayout mDrawerLayout;
其中
DrawerLayout
是java android中的一个类

mDrawerLayout = findViewById(R.id.drawer_layout);
由于
findViewById(R.id.drawer\u layout)
返回一个对象,我们将其分配给一个变量,我们需要使用

mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);

哦,这就像是一个类型转换的扩展?抱歉,我不明白这个问题。我只是在证实你所说的:“对象自动拥有视图拥有的所有方法,但定义了自己特定于抽屉布局的一些方法”,所以通过转换,对象也获得了抽屉布局的所有方法,而不仅仅是观景班。那么我想你很接近了。但请注意,类型转换根本不会更改实际对象;它只是改变了编译器对它的看法。如果您说
private View mDrawerLayout
,编译器在编译时不会知道
mDrawerLayout
实际上是一个
DrawerLayout
,因此它不允许您使用这些方法。如果您说了
private DrawerLayout mDrawerLayout
并试图在没有强制转换的情况下分配它,编译器将不允许您这样做;这是一个语言设计决策,主要是为了防止程序员意外地编写错误代码。我建议您使用缩进的代码来格式化您的答案,以显示为代码。这会使答案更容易阅读,但这并不能解释你为什么要投下它;或者至少,“因为…返回一个对象并…将其分配给一个变量”并不能解释为什么必须强制转换。