为什么我们总是在Android / Java中inputcast?

我正在编写一个Android应用程序,只是很好奇为什么我们必须总是在Android中input。 我知道我们需要确定types,以便我们的代码正确运行,但是在那里,也许是另一个原因?

例如

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

Solutions Collecting From Web of "为什么我们总是在Android / Java中inputcast?"

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

如果你需要在你的代码中做一个DrawerLayout ,你必须把它投入。 这确保(在运行时)它确实是这样一个对象(如果不是,你将得到一个ClassCastException ,你的程序将在这一点中止)。

你想把它转换为DrawerLayout的原因是你可能想调用在那个类中定义的实例的方法。 有时候,只要有更一般的超类的签名,你可能会好起来的。 那么你不必投。

可以肯定, findViewById返回的实例是一个DrawerLayout不pipe你是否使用它。 但是如果你不投它,那么Java就不会让你把它当成一个DrawerLayout 。 这是一个types安全的语言:除非编译器能够确定某个对象是某个类,否则不会让你调用该类的方法(或访问字段)。

DrawerLayoutView一个子类。 一个DrawerLayout对象自动拥有一个View所有的方法,但是它定义了一些特定于DrawerLayout的方法。 如果你不投它,你不能使用任何DrawerLayout方法; 您只能使用为所有View定义的方法。

types铸造什么都不做,真的。 findViewById被声明为返回一个View ,因为它可以返回所有不同种类的View 。 但实际上,它往往会返回一些其他类的对象,也就是View的子类。 types转换只是检查以确保返回的对象实际上是DrawerLayout (或它的一个子类)的一个实例; 如果不是,抛出一个exception,但是如果是这样的话,现在可以将对象看作DrawerLayout并使用DrawerLayout方法。

在android中 – 在编写java代码的时候,你需要在Java中引入XML代码。

所以我们使用R.id.drawer_layout就是我们想在java里面findViewById(R.id.drawer_layout)来返回一个Object

所以我们把它分配给一个在顶部声明的variables。

  private DrawerLayout mDrawerLayout; 

DrawerLayout是java android中的一个类。

 mDrawerLayout = findViewById(R.id.drawer_layout); 

由于findViewById(R.id.drawer_layout)返回一个对象,我们将它分配给一个variables,我们需要使用types转换

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