2015-04-06 70 views
0

而铸造在Java对象这个规则必须应用类铸造android系统编程

实例也可以转换为其他类的实例, 有一个限制:类所强制转换的对象和您正在将其投射到的 类必须通过继承关联;即 您只能将对象强制转换为其类的子类或 超类的实例 - 而不是任何随机类。

我不明白这个铸造是如何工作的,因为我还没有看到通过继承了Android文档中的任何关系:

 TelephonyManager manager = (TelephonyManager) getBaseContext() 
      .getSystemService(Context.TELEPHONY_SERVICE); 

上面是铸造上下文对象的TelephonyManager?

回答

2

在您的代码片段中,该投射应用于返回值getSystemService(),而不是Context对象。 getSystemService()方法的签名仅表示它应返回Object。并且文档表明确切的类(Object类的一个子类 - duh)取决于方法的参数。

+0

感谢这有意义现在 – kobewarui 2015-04-06 07:41:54

2

方法getSystemService() in Context返回Object。由于Java中的每个引用类型都是Object,因此可以将其转换为任何东西。

请记住,您不是在投射Context实例,而是getSystemService的结果。

+0

非常感谢你现在可以理解的 – kobewarui 2015-04-06 07:42:29

1

这不是铸造Context,它的铸造返回值Context.getSystemService(String),这是宣布返回Object。不管它是什么,实际的返回类型显然都与Object有继承关系。但是,如果它与TelephonyManager没有继承关系,则在运行时投射将失败。

Android API的这部分设计非常糟糕。他们可以很容易地通过提供诸如Context#getTelephonyManager()等方法来提高类型安全性并避免丑陋的铸造。对于这个问题,他们仍然可以。

+0

谢谢我也这么认为,因为方法getbasectontext是令人困惑的,这就是为什么我认为返回类型是类型上下文 – kobewarui 2015-04-06 07:48:25