Java Android需要强制执行findViewById()的返回吗?

Java Android需要强制执行findViewById()的返回吗?,java,android,listview,casting,Java,Android,Listview,Casting,要从Android中的XML中获取视图,可以使用findViewById() 由于findViewById()返回的是父对象View而不是ListView对象,因此我们需要强制执行findViewById()的返回 ListView ListView=(ListView)findViewById(R.id.ListView) findViewById()的输出,无需强制转换: System.out.println(findViewById(R.id.mainListView).getClass(

要从Android中的XML中获取视图,可以使用
findViewById()

由于
findViewById()
返回的是父对象View而不是ListView对象,因此我们需要强制执行
findViewById()的返回

ListView ListView=(ListView)findViewById(R.id.ListView)

findViewById()
的输出,无需强制转换:

System.out.println(findViewById(R.id.mainListView).getClass());     // class android.widget.ListView

System.out.println(findViewById(R.id.mainListView).getClass().getSimpleName());  // ListView

System.out.println((findViewById(R.id.mainListView) instanceof ListView));       // true

但是findViewById()确实返回了ListView对象,那么为什么有必要强制转换
findViewById()的返回呢?

您需要强制转换findViewById(int id)的结果,因为您不是强制转换ListView对象,而是强制转换一个视图,ListView只是其中的一个规范


您需要强制转换findViewById(int id)的结果,因为您不是强制转换ListView对象,而是强制转换一个视图,ListView只是其中的一个规范


作为一点,findViewById函数返回一个视图而不是它的子视图,我认为您对返回值和从getClass获得的信息感到困惑。findViewById(R.id.mainListView).getClass()的输出是ListView,因为view仍然有它的子视图的信息,您可以通过这种方式获得它。但是实际上findViewById返回一个view值,所以您必须手动将其装箱。

作为一个要点,findViewById函数返回一个视图而不是它的子视图,我认为您对返回值和从getClass获得的信息感到困惑。findViewById(R.id.mainListView).getClass()的输出是ListView,因为view仍然有它的子视图的信息,您可以通过这种方式获得它。但是实际上findViewById返回一个view的值,所以您必须手动将其装箱。

正如@Jon Skeet在注释中提到的,findViewById(int-id)方法通常返回view(而不是子视图),但是这个方法是泛型的,如果编译器知道目标类的类型,它可以返回子视图,所以在这种情况下,强制转换是多余的,但是如果目标类的类型是不受约束的,则必须显式强制转换。

正如@Jon Skeet在注释中提到的,findViewById(int id)方法通常返回视图(而不是子视图),但此方法是泛型的,如果编译器知道目标类的类型,则可以返回子视图,因此在这种情况下,强制转换是多余的,但如果目标类的类型是无约束的,则必须显式强制转换。

您确定在特定情况下需要它吗?文档中写道:“注意:在大多数情况下,根据编译器的支持,生成的视图会自动强制转换为目标类类型。如果目标类类型不受约束,则可能需要显式强制转换。”(该方法是泛型的,类型参数将由您尝试分配给的类型推断。)你确定你在那种情况下需要它吗?文档中写道:“注意:在大多数情况下,根据编译器的支持,生成的视图会自动强制转换为目标类类型。如果目标类类型不受约束,则可能需要显式强制转换。”(该方法是泛型的,类型参数将由您尝试分配给的类型推断。)