Java Android需要强制执行findViewById()的返回吗?
要从Android中的XML中获取视图,可以使用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(
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)方法通常返回视图(而不是子视图),但此方法是泛型的,如果编译器知道目标类的类型,则可以返回子视图,因此在这种情况下,强制转换是多余的,但如果目标类的类型是无约束的,则必须显式强制转换。您确定在特定情况下需要它吗?文档中写道:“注意:在大多数情况下,根据编译器的支持,生成的视图会自动强制转换为目标类类型。如果目标类类型不受约束,则可能需要显式强制转换。”(该方法是泛型的,类型参数将由您尝试分配给的类型推断。)你确定你在那种情况下需要它吗?文档中写道:“注意:在大多数情况下,根据编译器的支持,生成的视图会自动强制转换为目标类类型。如果目标类类型不受约束,则可能需要显式强制转换。”(该方法是泛型的,类型参数将由您尝试分配给的类型推断。)