我正在编写一个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的返回值。 (我也很好奇如果可以解释这种类型的铸造方法。)
答案 0 :(得分:11)
findViewById
从文件加载资源。它返回某种View
,但Java编译器无法知道它将是DrawerLayout
(因为它是在Java编译之外的文件中定义的)。
如果您需要在代码中使用DrawerLayout
,则必须进行投射。
这确保(在运行时)它确实是这样一个对象(如果不是,你会得到一个ClassCastException
,你的程序将在那时中止)。
您希望将其强制转换为DrawerLayout
的原因是您可能希望调用该类中定义的实例上的方法。有时,你可能只使用更一般的超类的签名。那你就不必投了它。
可以肯定的是,无论你是否投射,findViewById
返回的实例都是DrawerLayout
。但如果你没有投出它,那么Java不会让你把它当成DrawerLayout
。这是类型安全语言的要点:除非编译器能够确定某个对象属于某个类,否则它不会让您调用该类的方法(或访问字段)。
答案 1 :(得分:1)
DrawerLayout
是View
的子类。 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);