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

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

最佳答案

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

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

您希望将其转换为 DrawerLayout 的原因是您可能希望在该类中定义的实例上调用方法。有时,您可能只需要更通用的父类(super class)的签名就可以了。那么你不必投它。

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

关于java - 为什么我们总是在 Android/Java 中输入 cast?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30430138/

相关文章:

android - 创建的图像在 android 图库中无法识别

java - JScience 5.0 示例

android - Dart/Flutter 中的 "Invalid constructor name"错误

android - 以编程方式创建自定义搜索栏(无 XML)

android - Adapter.getView Kotlin android 参数 convertView 上的 IllegalArgumentException

java - 将mysql数据导出到ubuntu主目录下的csv文件

java - 搜索 map 的最佳方式

java - webservice向java应用程序返回json编码数据

java - 我应该如何设计我的线程,以便不需要实例化泛型?

java - MultipartEntity 和 Json